GLSL着色:整个屏幕都是彩色的,而不仅仅是四边形

时间:2015-02-16 10:17:07

标签: c++ opengl glsl fragment-shader vertex-shader

我完成的着色器用红色遮挡整个屏幕,而不是仅遮蔽我正在绘制的四边形。这里描述了我在代码中完成工作的方式。

#version 140 core
// vertex shader
in vec3 position;
out vec3 color;

void main(void)
{
    gl_Position = vec4(position,1.0);
    color = vec3(1.0,0.0,0.0);
}

#version 140 core
// fragment shader
in vec3 color;

out vec4 outColor;

void main(void)
{
    outColor = vec4(color,0.1);
}

然后我执行vao vbo的顺序是

/// vao buffer
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);

/// vbo - for vertices
glGenBuffers(1,&vbo1);
glBindBuffer(GL_ARRAY_BUFFER, ... );
glBufferData(GL_ARRAY_BUFFER, ...);
glVertexAttribPointer(0, 3, GL_FLOAT, ... );
glEnableVertexAttribArray(0);
glBindBuffer(0);

/// vbo for indices
glGenBuffers(1,&vbo2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ... );
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glVertexAttribPointer(1, 0, GL_UNSIGNED_INT);
glEnableVertexAttribArray(1);
glBindBuffer(0);

编译着色器程序,然后使用

与顶点位置绑定
glBindAttribLocation(progID, 0, "position");

我认为“position”与顶点着色器中的变量名称相同,并且它被绑定到第0个位置,因为多边形的顶点位于VAO Buffer中的第0个位置。我该怎么解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

绘图区域为-1,-11,1,因此如果四边形大于该范围,则绘制整个屏幕。

要考虑矩阵堆栈(输入或glRotate和朋友),您需要在顶点着色器中将位置乘以gl_ModelViewMatrix。但是,这在140核心中不可用,因此您需要兼容性或维护并明确传递矩阵。