在“顶点着色器”中设置变量时获取空白屏幕

时间:2012-07-16 03:47:10

标签: macos opengl glsl

我刚刚在OpenGL 3.2中创建了一个简单的矩形,现在我想添加照明支持。但是,每当我尝试将法线移动到片段着色器时,都不会出现任何内容。如果我注释掉那一行,它再次完美地运作。造成这种情况的原因是什么?错误日志中没有显示任何内容。

顶点着色器:

#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;
}

Fragment Shader:

#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中,但我宁愿不采用那种方法。

2 个答案:

答案 0 :(得分:1)

不确定这是您的实际代码还是剪切和粘贴,但调用glBindAttribLocation仅在 下一次调用glLinkProgram后生效。

如果在调用glBindAttrib之后没有链接程序,那么这些程序将不会生效,并且您的属性可能会被赋予错误的索引。这可以解释为什么在取消注释法线后你会得到不同的行为。

答案 1 :(得分:0)

可能是解决这个问题的最奇怪的原因,但它确实有效。

首先,确保您了解OpenGL Profiler的工作原理。 Apple Docs

提供了一个教程

在glDrawElements之前/之后设置一个断点(或者glDrawArray取决于你使用的是什么)

http://f.cl.ly/items/3A1R2Q3I472m2q3J1J3x/Screen%20Shot%202012-10-14%20at%202.46.26%20PM.png

然后查看程序的顶点属性并确保位置有序。

http://f.cl.ly/items/0f3c2G31113I2P1j3G3M/Screen%20Shot%202012-10-14%20at%202.47.24%20PM.png

如果不是,请重新排列。

从(或其他任何地方):

enum
{
POSITION_ATTR = 0,
TEXTURE_ATTR=1,
NORMAL_ATTR=2,
};

要:

enum
{
NORMAL_ATTR = 0,
TEXTURE_ATTR=2,
POSITION_ATTR=1,
};

不知道这是怎样以及为什么会发生这种情况,但这是解决问题的方法。