【问题标题】:Uniform not correctly loading in GLSL but hardcoded value does [closed]统一未正确加载 GLSL,但硬编码值确实 [关闭]
【发布时间】:2020-10-07 19:21:13
【问题描述】:

我正在尝试将顶点乘以投影矩阵,并使用单位矩阵对其进行测试。 当我对身份进行硬编码时,生成的图像不会像预期的那样改变

#version 330 core 

layout(location = 0) in vec position; 
void main() {
  gl_Position = glm::mat4(1.0f) * vec4(position, 1.0f); 
}

但是,当我将单位矩阵作为统一加载时,顶点会消失。

glm::mat4 model = glm::mat4(1.0f); 
GLuint ID = glGetUniformLocation(shaderProgram.ID, "model"); 
glUniformMatrix4fv(ID, 1, GL_FALSE, &model[0][0]); 

和着色器:

#version 330 core 

layout(location = 0) in vec position; 
uniform mat4 model; 

void main() {
  gl_Position = model * vec4(position, 1.0f); 
}

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 您很可能错过了在设置矩阵统一之前安装程序 (glUseProgram)。 glUniform*为当前程序对象指定一个统一变量的值
  • ...你为什么要在 GLSL 中使用 GLM 类型?你有一些时髦的 GLSL 预处理吗?

标签: opengl glsl shader vertex-shader


【解决方案1】:

两个顶点着色器都存在编译错误。

两个顶点着色器中的错误:

GLSL 中,数据类型 vec 不存在。数据类型名称为vec3

layout(location = 0) in vec position;

layout(location = 0) in vec3 position;

第一个顶点着色器出错:

glm::mat4(1.0f) 是 C++。在 GLSL 中是 mat4(1.0):

gl_Position = glm::mat4(1.0f) * vec4(position, 1.0f);

gl_Position = mat4(1.0) * vec4(position, 1.0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多