我已经完成了 learnopengl.com 上的突破系列中的几个教程,所以我有一个非常简单的 2D 渲染器。不过,我想向它添加一个子图像功能,我可以在其中为一种“源矩形”指定一个 vec4,所以如果 vec4 是 (10, 10, 32, 32)
,它只会在 10、10 处渲染一个宽度和高度为 32 的矩形,有点像 SDL 渲染器的工作方式。
渲染器的设置方式是有一个所有 Sprite 都使用的四边形 VAO,其中包含纹理坐标。最初,我虽然可以为每个 Sprite 使用一个 VAO 数组,每个 Sprite 都有不同的纹理坐标,但我希望能够在 Sprite 被绘制之前更改源矩形,以使动画之类的事情更容易......我的第二个想法是将一个单独的统一 vec4 传递到源矩形的片段着色器中,但是我如何仅在像素坐标中渲染该部分?
最佳答案
使用 Primitiv类型 GL_TRIANGLE_STRIP
或 GL_TRIANGLE_FAN
渲染一个四边形。使用整数一维顶点坐标而不是浮点顶点坐标。顶点坐标是四边形角的索引。对于 GL_TRIANGLE_FAN
他们是:
vertex 1: 0
vertex 2: 1
vertex 3: 2
vertex 4: 3
在顶点着色器中设置矩形定义 (10, 10, 32, 32) uisng a Uniform vec4
类型的变量.使用此信息,您可以计算顶点着色器中的顶点坐标:in int cornerIndex;
uniform vec4 rectangle;
void main()
{
vec2 vertexArray[4] =
vec2[4](rectangle.xy, rectangle.zy, rectangle.zw, rectangle.xw);
vec2 vertex = vertexArray[cornerIndex];
// [...]
}
Vertex Shader提供内置输入 gl_VertexID
,它指定当前正在处理的顶点的索引。这个变量可以用来代替cornerIndex
在这种情况下。请注意,顶点着色器不需要任何显式输入。
关于c++ - 使用像素坐标的 OpenGL 子图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64129758/