opengl - GLSL 片段着色器输出类型

标签 opengl glsl framebuffer

假设我遇到这样的问题:现在我有一个帧缓冲区,并且一个纹理仅包含一个已绑定(bind)到它的颜色组件(例如,GL_RED)。片段着色器会是什么样子?我猜答案是:

... out float ex_color;

ex_color = ...;

我的问题是:着色器会自动检测帧缓冲区的格式并向其写入值吗?如果片段着色器输出浮点值但帧缓冲区格式为 GL_RGBA 会怎样?

顺便问一下,创建只有一个组件的纹理的正确方法是什么?我阅读了 g-truc 中的示例,其中有一个如下示例:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED,GLsizei(Texture.dimensions().x), GLsizei(Texture.dimensions().y), 0,GL_RGB, GL_UNSIGNED_BYTE, 0);

指定 GL_RGB 作为像素数据格式是什么意思?

最佳答案

就像 vertex shader inputs不必与 glVertexAttribPointer fragment shader outputs 指定的数据的确切大小匹配不必与要写入的图像的确切大小相匹配。如果输出提供的组件多于目标图像格式,则多余的组件将被忽略。如果它提供的值较少,则其他组件具有未定义的值(与顶点输入不同,其中未指定的值具有明确定义的值)。

What's the meaning of assign GL_RGB as pixel data format?

这就是pixel transfer format 。它描述了您提供给 OpenGL 的像素格式,而不是 OpenGL 存储它们的格式。

您应该始终使用sized internal formats ,而不是像 GL_RED 这样的未调整大小的。

关于opengl - GLSL 片段着色器输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943984/

相关文章:

c - 像 "GLenum GlewInitResult = glewInit();"这样的声明(?)是做什么的?

c++ - 使用 SDL_WINDOW_OPENGL 标志创建窗口速度较慢

opengl-es - 用于粒子系统的 GLSL PointSprite

Linux 帧缓冲区查看器

c++ - 使 Qt 窗口窗体适应预构建的 QWindow

c++ - glsl - 光线行进在片段着色器中不起作用

javascript - THREE.js vertexShader 基于高度的颜色混合

c++ - 如何在qt中检测屏幕分辨率?

OpenGL,如何像平常深度缓冲区一样使用帧缓冲区中的深度缓冲区

c++ - OpenGL 链接错误? Unresolved external glCreateShader()