gpt4 book ai didi

jogl - GL_TEXTURE_2D 与 GL_TEXTURE_RECTANGLE

转载 作者:行者123 更新时间:2023-12-02 11:51:30 28 4
gpt4 key购买 nike

我有一个小程序,可以渲染一个黄色三角形两次,一次在帧缓冲区的左半部分,一次在右侧。

纹理转储

enter image description here

现在,之后我在屏幕上渲染该帧缓冲区的内容。

如果我在帧缓冲区构造函数中使用 GL_TEXTURE_RECTANGLE ,它就会起作用:

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

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

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

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

#version 330

out vec4 outputColor;
uniform sampler2DRect texture0;

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

但是,如果我将所有矩形更改为 2D 并在 fs 中使用sample2D,我会在显示()结束时得到全黑图像,尽管纹理转储始终显示正确的图像...我想知道为什么。

最佳答案

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

  • 对于GL_TEXTURE_RECTANGLE来说,整个纹理图像对应的纹理坐标范围是[0.0, width] x [0.0, height]。换句话说,纹理坐标的单位是纹理图像的像素。
  • 对于GL_TEXTURE_2D,纹理坐标的范围是[0.0, 1.0] x [0.0, 1.0]。

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

outputColor = texture(texture0, gl_FragCoord.xy);

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

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

#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;
}

以及片段着色器:

#version 330

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

void main() {
outputColor = texture(texture0, texCoord);
}

关于jogl - GL_TEXTURE_2D 与 GL_TEXTURE_RECTANGLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25157306/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com