首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GL_TEXTURE_2D对GL_TEXTURE_RECTANGLE

GL_TEXTURE_2D对GL_TEXTURE_RECTANGLE
EN

Stack Overflow用户
提问于 2014-08-06 09:55:19
回答 1查看 5.3K关注 0票数 6

我有一个小程序,它渲染一个黄色三角形两次,一次在帧缓冲区的左边,一次在右边。

纹理转储

现在,在此之后,我在屏幕上呈现此框架缓冲区的内容。

如果我在框架缓冲区构造函数中使用GL_TEXTURE_RECTANGLE,它就能工作:

https://github.com/elect86/Joglus/blob/master/Joglolus/src/joglus/example1/FrameBuffer.java

在绑定纹理时,函数renderFullScreenQuad,第372行:

https://github.com/elect86/Joglus/blob/master/Joglolus/src/joglus/example1/GlViewer.java

并在片段着色器中使用sampler2DRect:

代码语言:javascript
复制
#version 330

out vec4 outputColor;
uniform sampler2DRect texture0;

void main() {
    outputColor = texture(texture0, gl_FragCoord.xy);
}

但是,如果我将所有矩形更改为2D,并且在fs中使用sample2D,则会在显示()的末尾得到一个总黑色图像,尽管纹理转储显示的总是正确的图像.我想知道为什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-07 06:18:10

纹理坐标在GL_TEXTURE_RECTANGLEGL_TEXTURE_2D类型的纹理之间的工作方式不同

  • 对于GL_TEXTURE_RECTANGLE,与整个纹理图像对应的纹理坐标范围为0.0,宽度x0.0,高度。换句话说,纹理坐标的单位是以纹理图像的像素为单位。
  • 对于GL_TEXTURE_2D,纹理坐标的范围是0.0,1.0x0.0,1.0。

在片段着色器中使用此语句:

代码语言:javascript
复制
outputColor = texture(texture0, gl_FragCoord.xy);

您正在使用像素单位中的坐标作为纹理坐标。基于上述,这将适用于RECTANGLE纹理,但不适用于2D

由于顶点着色器中的原始输入坐标似乎在0.0、1.0范围内,因此修复此问题的最简单方法是将未转换的坐标从顶点着色器传递到片段着色器,并使用它们作为纹理坐标。然后顶点着色器看起来如下所示:

代码语言:javascript
复制
#version 330

layout (location = 0) in vec2 position;
out vec2 texCoord;
uniform mat4 modelToClipMatrix;

void main() {
    gl_Position = modelToClipMatrix * vec4(position, 0, 1);
    texCoord = position;
}

碎片着色器:

代码语言:javascript
复制
#version 330

in vec2 texCoord;
out vec4 outputColor;
uniform sampler2D texture0;

void main() {
    outputColor = texture(texture0, texCoord);
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25157306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档