光源设置不正确

2023-12-25

我有这段代码,但灯光似乎无法正常工作,当我渲染对象时它很暗,然后当我旋转它时,光源似乎也旋转了。我不知道问题出在哪里。我尝试修改灯光模型但仍然不起作用

这是程序:

while (!glfwWindowShouldClose(window))
    {

        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glm::mat4 view = glm::mat4(1.0f); 
        glm::mat4 projection = glm::mat4(1.0f);
        projection = glm::perspective(glm::radians(45.0f), (float)width / (float)heigh, 0.1f, 100.0f);

        view = glm::translate(view, glm::vec3(0.0f, 0.0f, transZ)); //this is for scroll mouse
        view = glm::translate(view, glm::vec3(0.0f, 0.0f, -2.0f));
        view = glm::translate(view, glm::vec3(0.0f, 0.0f, -5.0f));
                
        glUseProgram(programT);
        int lightColorLoc = glGetUniformLocation(programT, "lightColor");
        glUniformMatrix4fv(lightColorLoc, 1, GL_FALSE, glm::value_ptr(glm::vec3(1.0f, 0.0f, 0.0f)));

        int objectColorLoc = glGetUniformLocation(programT, "objectColor");
        glUniformMatrix4fv(objectColorLoc, 1, GL_FALSE, glm::value_ptr(glm::vec3(1.0f, 0.5f, 0.31f)));

        glm::vec3 lightPos(2.0f, 4.0f, 5.0f);
        int lightPosLoc = glGetUniformLocation(programT, "lightPos");
        glUniformMatrix4fv(lightPosLoc, 1, GL_FALSE, glm::value_ptr(lightPos));

        int projectionLocLight = glGetUniformLocation(programT, "projection");
            glUniformMatrix4fv(projectionLocLight, 1, GL_FALSE, glm::value_ptr(projection));
        glm::mat4 modelLight = glm::mat4(1.0f);
        int modelLocLight = glGetUniformLocation(programT, "model");
        glUniformMatrix4fv(modelLocLight, 1, GL_FALSE, glm::value_ptr(modelLight));

        glm::mat4 viewLight = glm::mat4(1.0f); 
        int viewLocLight = glGetUniformLocation(programT, "view");
        glUniformMatrix4fv(viewLocLight, 1, GL_FALSE, glm::value_ptr(viewLight));

        int viewLoc = glGetUniformLocation(programT, "view");
        glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));

        int projectionLoc = glGetUniformLocation(programT, "projection");
        glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));

        model = glm::rotate(model, glm::radians(rotX), glm::vec3(1.0f, 0.0f, 0.0f));
        model = glm::rotate(model, glm::radians(rotY), glm::vec3(.0f, 1.0f, .0f));
        model = glm::rotate(model, glm::radians(rotZ), glm::vec3(.0f, 0.0f, 1.0f));
        int modelLoc = glGetUniformLocation(programT, "model");
        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));

                 

        glGenerateMipmap(GL_TEXTURE_2D);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, textureArray[0]);
        glUniform1i(glGetUniformLocation(programT, "ourTexture"), 0);
            


            glBindVertexArray(VAOArray[0]);
        glDrawArrays(GL_TRIANGLES, 0, myMeshes.at(0).Indices.size());
    

        
        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
        glfwSetKeyCallback(window, key_callback);
        glfwSetScrollCallback(window, scroll_callback);
        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
        
    }

以下是我的顶点着色器:

#version 330 core


layout (location = 0) in vec3 RealPos;
layout (location = 1) in vec3 vertex_color;
layout (location = 2) in vec2 vertex_textcoord;
layout (location = 3) in vec3 RealNor;


out vec3 vs_pos;
out vec3 vs_color;
out vec2 vs_text;
out vec3 normal;
out vec3 FragPos;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;


void main()
{
    vs_pos = RealPos;
    vs_color = vertex_color;
    vs_text=vertex_textcoord;
    
    normal=RealNor;
    FragPos = vec3(model * vec4(vs_pos, 1.0));
    
    gl_Position = projection * view * model * vec4(vs_pos, 1.0);
}

以下是片段着色器:

#version 330 core

in vec2 vs_text;
in vec3 normal;
in vec3 FragPos;

uniform vec3 lightPos;
out vec4 gl_FragColor;



uniform vec3 objectColor;
uniform vec3 lightColor;


uniform sampler2D ourTexture;



void main()
{
    vec3 norm = normalize(normal);
    vec3 lightDir = normalize(lightPos - FragPos);
    float ambientStrength = 0.1;
        vec3 ambient = ambientStrength * lightColor;
    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = diff * lightColor;
    vec3 result = (ambient + diffuse) * objectColor;
    gl_FragColor =  texture(ourTexture, vs_text) * vec4(result,1.0);
}

我该如何解决这个问题?


片段着色器中的光照计算是在世界空间中完成的。因此,您必须将法线向量与法线矩阵从对象空间变换到世界空间:

mat3 normalMatrix = transpose(inverse(mat3(model)));

normal = normalMatrix * RealNor;
FragPos = vec3(model * vec4(vs_pos, 1.0));

See 为什么使用模型视图矩阵的转置逆矩阵来变换法向量? https://computergraphics.stackexchange.com/questions/1502/why-is-the-transposed-inverse-of-the-model-view-matrix-used-to-transform-the-nor and 为什么要通过模型视图矩阵的逆矩阵转置来变换法线? https://stackoverflow.com/questions/13654401/why-transforming-normals-with-the-transpose-of-the-inverse-of-the-modelview-matr


想象一下桌子上有一个旋转器和一盏台灯。你的眼睛就是相机。这model矩阵模拟旋转。这使得旋转器的不同侧面在旋转时被照亮。但是,灯的位置不会相对于您的位置而改变。
当您改变位置(眼睛的位置)时,灯的相对位置也会改变。这可以通过改变来建模view matrix.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

光源设置不正确 的相关文章

随机推荐

  • 如何获取 Twitter API 列表中的所有用户?

    有没有办法访问列表中的所有成员 目前只能看到前20名会员 具体来说 我正在使用 python 和 tweepy 在 Tweepy 中 可以通过使用 Tweepy 提供的 Cursor 类来实现这一点 该类根据您所需的方法调用为返回给您的模型
  • ASP.NET MVC 3 RC 2 全球化客户端验证

    我的目标是根据用户的文化在客户端验证用户输入 我有一个具有以下结构的原始数据模型 public class User public int UserId get set Required StringLength 20 MinimumLen
  • 我们可以通过hiredis将C int数组设置为Redis中的键值吗?

    给定 int x 3 11 22 33 如何将其保存为键的值作为二进制数据并获取它 hiredis 给出了如何设置二进制安全字符串的示例 Set a key using binary safe API reply redisCommand
  • 无法在InitializeGL和paintGL之外调用OpenGL相关函数

    正如标题所示 在 Qt 内部 我无法使用或调用 QGLWidget 函数之外的任何 OpenGL 函数 例如initializeGL and paintGL 我正在尝试构建一个 3D 模型 在我的插槽之后QMainWindow类被称为 一切
  • JPA:设置参数后,如何获取/打印(类型化)查询后面的 JPQL 查询字符串?

    如何获取 打印 类型化 查询后面的 JPQL 查询字符串 即after参数已设置 例如用于调试目的 一个简单的toString 似乎没有做到这一点 Thanks 不存在 最终被转换为最终 SQL 的最终 JPQL 这样的事情 JPA 实现如
  • AWS RDS 的间歇性 SQL 连接问题

    目前 我们的 ASP NET 网站 基于 Sitecore 构建 遇到间歇性问题 该网站看似随机的 15 分钟内无法连接到 SQL Server 15 分钟后 问题自行解决 网站恢复正常 错误信息是 Exception System Dat
  • SAS proc sql返回group by/order by变量的重复值

    我有一些相当简单的 SQL 应该为每个资产每季度提供 1 行 相反 我每组得到多行 下面是 SQL SAS 数据步骤和一些输出数据 重复行数 在下面的数据中为 227708 等于 Num borrowers 即 asset1 的行数 pro
  • 为什么标签的高度比其内容大?

    我创建了一个小片段来说明问题 我有一个svg里面的图标 i 标签 这是我的图标的基本块 放置在我的页面的各个位置 为了这个示例 我将其放置在一个简单的 div 容器中 如果您检查下面示例的结果 您会发现 i 标签的高度为33px not 3
  • 在 PHP 中,函数是二进制安全的意味着什么?

    In PHP函数是什么意思binary safe 它们有何特别之处 它们通常用在什么地方 这意味着当您向函数传递任意二进制数据 即包含非 ASCII 字节和 或空字节的字符串 时 该函数将正常工作 例如 非二进制安全函数可能基于需要空终止字
  • 在 MongoDB 中执行 JavaScript 文件

    我想知道如何在 MongoDB 中执行 JavaScript 文件 这是我的 JS 文件中的一段简单代码 function loadNames print name 从命令提示符我尝试像这样执行文件 mongo test js 但它显示错误
  • 如何限制Go中实现的HTTP服务器的连接数?

    我正在尝试在 Golang 中实现 HTTP 服务器 我的问题是 我必须将任何特定时间的最大活动连接数限制为 20 您可以使用netutil LimitListener https godoc org golang org x net ne
  • jQuery 滑块作为时间线

    我刚刚完成了 jQuery 手风琴与 jQuery 滑块的合并 IE 显示 3 张图片 用户可以使用PREV or NEXT按钮可查看下一张 上一张 3 张图像 他们还可以使用滑块浏览所有图像 下一步是使这个滑块看起来像时间线 左侧需要从
  • 我应该使用哪个(对于基于 python 的网站)? sass、compass、switchcss...替代品? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 组织 CSS 的最佳系统是什么 我正在制作几个使用 python 作为后端脚本的网站 我有兴趣使用一些东西来帮助我组织长 css 脚本 我
  • 使用 Jackson 反序列化包装列表

    我有一个像这样的 JSON 对象 geonames countryId 2017370 adminCode1 73 countryId 2027370 adminCode1 71 我怎样才能反序列化这个对象DIRECTLY to List
  • 如何在 Spring 应用程序上下文中将 Class 设置为属性值?

    有没有办法配置 spring 应用程序上下文 以便它将使用 Class 类型的值初始化 setter 我需要初始化该结构 Map
  • 将 RTSP 流转换为虚拟网络摄像头

    我正在尝试使用来自 IP 摄像机的 RTSP 流作为 Windows 上各种应用程序 例如 Skype Zoom Microsoft Teams 等 的视频输入源 到目前为止我找到的唯一解决方案是使用 webcam 7 http www w
  • std::weak_ptr:锁或shared_ptr构造函数?

    似乎有两种方法可以暂时获取 a 所指向的资源的所有权weak ptr Use lock 通过weak ptr to a shared ptr构造函数 这两者都会产生一个shared ptr 锁返回一个nullptr在这种情况下weak pt
  • 动态设置线性布局背景

    我想通过以下方式动态设置线性布局背景 通过 XML 解析从 Web url 获取图像 然后将该图像存储到 SD 卡中 现在图像已保存到 SD 卡中 将该图像设置为应用程序中的线性布局背景 现在我陷入了第三步 有人可以帮忙吗 用这个 Bitm
  • 在Thread中使用EnterCriticalSection更新VCL标签

    我是线程新手 我正在使用一个第三方库 该库使用线程 有时会调用我提供的过程 当线程调用我的过程时 如何更新 TLabel Caption 如果我在其他地方调用了InitializeCriticalSection 它是否像 EnterCrit
  • 光源设置不正确

    我有这段代码 但灯光似乎无法正常工作 当我渲染对象时它很暗 然后当我旋转它时 光源似乎也旋转了 我不知道问题出在哪里 我尝试修改灯光模型但仍然不起作用 这是程序 while glfwWindowShouldClose window Rend