【问题标题】:Opengl GLSL render to textureOpengl GLSL 渲染到纹理
【发布时间】:2013-10-05 00:40:53
【问题描述】:

我正在尝试使用 OpenGL + GLSL 着色器渲染纹理。首先,我尝试用白色填充 30x30 纹理的每个像素。我从 0 到 899 传递到顶点着色器索引,代表纹理的每个像素。它是否正确? 顶点着色器:

flat in int index;

void main(void) {
gl_Position = vec4((index % 30) / 15 - 1, floor(index / 30) / 15 - 1, 0, 1); 
}

片段着色器:

out vec4 color;


void main(void) {
color = vec4(1, 1, 1, 1);
}

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    您要渲染 900 个顶点,每个像素一个顶点?你为什么这样做?您使用的是什么原始类型。仅当您使用点时才有意义,但是您需要稍微修改输出坐标才能真正到达片段中心。

    通常的方法是只渲染填充整个帧缓冲区的四边形(很容易表示为只有 4 个顶点的三角形条带)。要实现这一点,您只需将视口设置为完整的帧缓冲,并且渲染是从 (-1,-1) 到 (1,1) 的四边形。

    请注意,在这两种方法中,您都不需要顶点属性。您可以只使用gl_VertexID(在您的方法中直接作为index 的替代品,或者作为四边形的4 个顶点坐标的常量数组的索引)。

    【讨论】:

    • 我正在尝试渲染 900 个顶点,因为我希望能够更改纹理的每个像素的颜色,并且我正在使用 GL_POINTS。
    • @user1760770:嗯,您也可以使用该四边形方法更改每个点的颜色。为每个单独的片段调用片段着色器。如果您担心如何将数据传递给片段着色器:纹理是标准答案。您甚至可以使用 TBO 直接从 FS 访问一些缓冲区对象。
    • 我不太确定如何在片段着色器中获取片段的位置。
    • @user1760770:可以通过gl_FragCoord内置变量获取片段的窗口空间位置。
    • @user1760770: gl_VertexID 在 GLSL 110/120 中不受支持,它是在 OpenGL 3.0 (GLSL 130) / 顶点实例化中添加的。但是,我怀疑这不是问题,因为片段着色器使用flat in,这在 GLSL 110 中也不支持。这就是#version ... 很重要的原因:所以我们不必猜测哪些功能 应该被支持:)没有#version ...,编译器和程序员是supposed 假设 110 (OpenGL 2.0) 是隐含的。
    猜你喜欢
    • 2015-05-10
    • 2023-03-30
    • 2012-06-03
    • 2014-07-22
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多