Macos 在顶点着色器中设置变量时获得空白屏幕
我刚刚在OpenGL3.2中创建了一个简单的矩形,现在我想添加照明支持。但是,每当我尝试将法线移动到片段着色器时,都不会显示任何内容。如果我把那句话注释掉,它又能完美地工作了。这是什么原因造成的?错误日志中没有显示任何内容 顶点着色器:Macos 在顶点着色器中设置变量时获得空白屏幕,macos,opengl,glsl,Macos,Opengl,Glsl,我刚刚在OpenGL3.2中创建了一个简单的矩形,现在我想添加照明支持。但是,每当我尝试将法线移动到片段着色器时,都不会显示任何内容。如果我把那句话注释掉,它又能完美地工作了。这是什么原因造成的?错误日志中没有显示任何内容 顶点着色器: #version 150 in vec4 position; in vec3 inNormal; out vec3 varNormal; uniform mat4 modelViewProjectionMatrix; void main() {
#version 150
in vec4 position;
in vec3 inNormal;
out vec3 varNormal;
uniform mat4 modelViewProjectionMatrix;
void main()
{
//varNormal = inNormal; //If I uncomment this line, nothing shows up
gl_Position = modelViewProjectionMatrix * position;
}
片段着色器:
#version 150
in vec3 varNormal;
out vec4 fragColor;
void main()
{
fragColor = vec4(1, 1, 1, 1);
}
并传递法线:
GLuint posAttrib = 0;
GLuint normalAttrib = 1;
glBindAttribLocation(program, posAttrib, "position");
glBindAttribLocation(program, normalAttrib, "normalAttrib");
//Building the VAO's/VBO's
GLfloat posCoords[] =
{
-10, 0.0, -10,
-10, 0.0, 10,
10, 0.0, 10,
10, 0.0, -10,
};
GLfloat normalCoords[] =
{
0, 0, 1,
0, 0, 1,
0, 0, 1,
0, 0, 1
};
glGenVertexArrays(1, &vaoName);
glBindVertexArray(vaoName);
GLuint posBuffer;
glGenBuffers(1, &posBuffer);
glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(posCoords), posCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(posAttrib);
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
GLuint normalBuffer;
glGenBuffers(1, &normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(normalCoords), normalCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(normalAttrib);
glVertexAttribPointer(normalAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
我还没有试着把我所有的立场和正常的协调放在一个VBO中,但我不想求助于这种方法 不确定这是您的实际代码还是剪切粘贴,但调用GLBindAttriblLocation仅在下一次调用glLinkProgram后生效
如果在调用glBindAttrib后没有链接程序,这些链接将不会生效,并且您的属性可能会被赋予错误的索引。这可以解释为什么在取消对正常行的注释后会出现不同的行为。这可能是修复此问题最奇怪的原因,但它是有效的 首先,确保您知道OpenGL分析器是如何工作的。有一个由 在glDrawElements之前/之后设置断点(或glDrawArray,具体取决于您使用的内容) 然后查看程序的顶点属性,确保位置有序 如果它们不是,请重新排列它们 来自(或任何其他): 致:
不知道这是如何发生的以及为什么发生的,但这是问题的解决方案。它们已经使用字符串数组声明了,我只是没有将其包含在我的代码片段中,因为我认为这是不必要的。“属性”和“制服”不是两个不同的东西吗?它只是剪切粘贴在这里,因为有人对我的问题发表了评论,说我应该在我的问题中添加更多内容,但后来他删除了他的评论,所以。。。
enum
{
POSITION_ATTR = 0,
TEXTURE_ATTR=1,
NORMAL_ATTR=2,
};
enum
{
NORMAL_ATTR = 0,
TEXTURE_ATTR=2,
POSITION_ATTR=1,
};