You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的映射:

  1. 引入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));
  1. 修改顶点着色器接收投影矩阵并做坐标变换:
#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:54:09