使用GL_TRIANGLE_STRIP绘制三角形时异常渲染出矩形问题求助
问题原因与修复方案
你遇到的渲染异常是两个核心错误共同导致的:
- 顶点属性类型不匹配:CPU侧通过
glVertexAttribPointer指定每个顶点传入2个float坐标,但顶点着色器中声明的输入是vec3 aPos,会导致读取VBO时越界,出现未知的z坐标值,引发未定义行为。 - 坐标空间错误:你直接传入了像素级坐标,而OpenGL默认的归一化设备坐标(NDC)范围为[-1,1],超出范围的坐标会被视口变换映射到窗口外。你设置的三个顶点坐标数值过大,全部落在窗口外部,但三个顶点组成的三角形内部恰好覆盖了整个窗口区域,所以最终渲染出来的是全屏的单色矩形,看不到原本的三角形形状。
修复步骤
1. 匹配顶点属性
把顶点着色器的输入类型改为vec2,和CPU侧传入的2个分量对应:
#version 330 core layout(location = 0) in vec2 aPos; void main() { gl_Position = vec4(aPos, 0.0, 1.0); }
也可以选择在CPU侧的顶点数组中每个顶点补充一个z=0的分量,保持着色器输入为vec3。
2. 修正坐标范围
把顶点坐标调整到[-1,1]的NDC范围内,示例如下:
GLfloat coordinates[coordinateCount] = { 1.0f, 0.0f, -1.0f, 1.0f, -1.0f, -1.0f, };
如果需要保留像素坐标的使用习惯,可以引入正交投影矩阵完成像素坐标到NDC的映射:
- 引入glm库,在创建着色器之后添加投影矩阵的设置:
#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> // ... 省略原有代码 ... glUseProgram(program); // 添加投影矩阵设置 int projLoc = glGetUniformLocation(program, "proj"); glm::mat4 proj = glm::ortho(0.0f, 640.0f, 0.0f, 480.0f, -1.0f, 1.0f); glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(proj));
- 修改顶点着色器接收投影矩阵并做坐标变换:
#version 330 core layout(location = 0) in vec2 aPos; uniform mat4 proj; void main() { gl_Position = proj * vec4(aPos, 0.0, 1.0); }
修复之后,再运行就能得到预期的三角形渲染结果。
内容的提问来源于stack exchange,提问作者Sero Mirzakhanyan
相关产品推荐
相关产品推荐

