c++ - 使用像素坐标的 OpenGL 子图像

标签 c++ opengl glsl shader

我已经完成了 learnopengl.com 上的突破系列中的几个教程,所以我有一个非常简单的 2D 渲染器。不过,我想向它添加一个子图像功能,我可以在其中为一种“源矩形”指定一个 vec4,所以如果 vec4 是 (10, 10, 32, 32) ,它只会在 10、10 处渲染一个宽度和高度为 32 的矩形,有点像 SDL 渲染器的工作方式。
渲染器的设置方式是有一个所有 Sprite 都使用的四边形 VAO,其中包含纹理坐标。最初,我虽然可以为每个 Sprite 使用一个 VAO 数组,每个 Sprite 都有不同的纹理坐标,但我希望能够在 Sprite 被绘制之前更改源矩形,以使动画之类的事情更容易......我的第二个想法是将一个单独的统一 vec4 传递到源矩形的片段着色器中,但是我如何仅在像素坐标中渲染该部分?

最佳答案

使用 Primitiv类型 GL_TRIANGLE_STRIPGL_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/

相关文章:

c++ - 由于架构 x86_64 的符号未定义,GLFW 的最小示例失败

C++ vector 元素在不同时间访问时是不同的

c++ - 这可以用 OpenGL 完成吗?

javascript - 三.JS | GLSL 通过场景纹理设置粒子颜色

python-3.x - 我的着色器出现错误并且不知道如何修复

python - 来自 Python 中另一个实例的实例

c++ - 如何在迭代器位置后插入元素

c++ - 既然可以使用copy shell命令,为什么还要自己写一个copy程序呢?

c++ - 赋值运算符与自定义构造函数的关系

performance - "Intrinsics"可能在 OpenGL 上的 GPU 上吗?