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

现在,在此之后,我在屏幕上呈现此框架缓冲区的内容。
如果我在框架缓冲区构造函数中使用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:
#version 330
out vec4 outputColor;
uniform sampler2DRect texture0;
void main() {
outputColor = texture(texture0, gl_FragCoord.xy);
}但是,如果我将所有矩形更改为2D,并且在fs中使用sample2D,则会在显示()的末尾得到一个总黑色图像,尽管纹理转储显示的总是正确的图像.我想知道为什么。
发布于 2014-08-07 06:18:10
纹理坐标在GL_TEXTURE_RECTANGLE和GL_TEXTURE_2D类型的纹理之间的工作方式不同
GL_TEXTURE_RECTANGLE,与整个纹理图像对应的纹理坐标范围为0.0,宽度x0.0,高度。换句话说,纹理坐标的单位是以纹理图像的像素为单位。GL_TEXTURE_2D,纹理坐标的范围是0.0,1.0x0.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);
}https://stackoverflow.com/questions/25157306
复制相似问题