我正在努力让我的简单着色器与我当前的OpenGL设置一起工作。我正在使用着色器管理器并在加载着色器时,所有输出都显示它们已正确加载。
这是我的数据:
static const GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};
这是我设置缓冲区的地方:
// This will identify our vertex buffer
GLuint vertexbuffer;
// Generate 1 buffer, put the resulting identifier in vertexbuffer
glGenBuffers(1, &vertexbuffer);
// The following commands will talk about our 'vertexbuffer' buffer
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
// Give our vertices to OpenGL.
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
这是我使用经过测试和工作的着色器加载器的着色器声明:
Shader shader;
shader.loadFromFile(VERTEX_SHADER, resourcePath() + "tri.vert");
shader.loadFromFile(FRAGMENT_SHADER, resourcePath() + "tri.frag");
shader.createAndLinkProgram();
shader.use();
shader.addAttribute("position");
shader.unUse();
然后将此着色器的属性存储在地图中。这是渲染调用:
shader.use();
glEnableVertexAttribArray(shader["position"]);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
shader["position"], // attribute 0. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the triangle !
glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle
glDisableVertexAttribArray(shader["position"]);
shader.unUse();
然后我交换了缓冲区。我尝试使用旧的GL_TRIANGLES固定管道绘图,它工作正常。
这是我的顶点着色器:
#version 330
layout(location = 0) in vec3 position;
void main()
{
gl_Position.xyz = position;
}
这是我的片段着色器:
out vec3 color;
main()
{
color = vec3(1,0,0);
}
应该简单地绘制一个红色三角形。当我使用中间模式绘制时,它渲染得很好。我在Mac OSX 10.7.4上运行Xcode。
答案 0 :(得分:2)
gl_Position.xyz = position;
W坐标是什么?重要的是不要将它定义为未定义。如果您希望它为1.0,则需要将其设置为:
gl_Position = vec4(position, 1.0);
答案 1 :(得分:0)
gl_Position必须提供x,y,z,w坐标。 在1.50以上的GLSL版本中,你必须在着色器中提供矩阵操作,你必须使用像GLM http://glm.g-truc.net/
这样的数学库来做投影,模型,视图矩阵。从顶点数据集中,z坐标是0.0,它与场景的中心相同。证明Z坐标的某些-ve值并检查结果。