我正在编写一个Java (JOGL)程序,用着色器程序进行一些计算,并且我正在体验来自片段着色器的奇怪的输出值。更具体地说,glGetTexImage()似乎返回缩放的值。
下面是一个简单的片段着色器。
#version 330
layout(location=0) out vec4 fs_out_color;
void main(){
fs_out_color=vec4(-1.0,0.5,0.4,2.0);
}我创建一个浮点纹理,以获得输出的着色器。TEXTURE_WIDTH和TEXTURE_HEIGHT都是2。
glBindTexture(GL4.GL_TEXTURE_2D, texture_id);
glTexImage2D(
GL4.GL_TEXTURE_2D, 0, GL4.GL_RGBA32F,
TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL4.GL_RGBA, GL4.GL_FLOAT, null);
glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_NEAREST);
glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_NEAREST);
glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_WRAP_S, GL4.GL_CLAMP_TO_EDGE);
glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_WRAP_T, GL4.GL_CLAMP_TO_EDGE);
glBindTexture(GL4.GL_TEXTURE_2D, 0);GL_RGBA32F被传递给glTexImage2D()的第三个参数,以获得未夹紧的值。
然后,使用以下代码获取结果:
int size=TEXTURE_WIDTH*TEXTURE_HEIGHT*4;
FloatBuffer buf=Buffers.newDirectFloatBuffer(size);
glBindTexture(GL4.GL_TEXTURE_2D, texture_id);
glGetTexImage(GL4.GL_TEXTURE_2D, 0, GL4.GL_RGBA, GL4.GL_FLOAT, buf);
glBindTexture(GL4.GL_TEXTURE_2D, 0);最后,它们被输出到控制台。
for(int i=0;i<size;i+=4) {
float r=buf.get();
float g=buf.get();
float b=buf.get();
float a=buf.get();
String str="("+r+","+g+","+b+","+a+")";
System.out.println(str);
}我在这里期望的是类似于(-1.0,0.5,0.4,2.0)的东西。然而,实际输出是
(-2.0,1.0,0.8,4.0)
(-2.0,1.0,0.8,4.0)
(-2.0,1.0,0.8,4.0)
(-2.0,1.0,0.8,4.0)我在着色器中尝试了另一个vec4变量vec4(-10.0,0.5,0.4,20.0),我得到了
(-200.0,10.0,8.0,400.0)
(-200.0,10.0,8.0,400.0)
(-200.0,10.0,8.0,400.0)
(-200.0,10.0,8.0,400.0)我做错什么了吗?如何获得片段着色器的原始输出?
如有任何建议,将不胜感激。
注意:
破片着色机
fs_out_color=vec4(-1.0,0.5,0.4,2.0);Java代码
glTexImage2D(
GL4.GL_TEXTURE_2D, 0, GL4.GL_RGBA,
TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL4.GL_RGBA, GL4.GL_FLOAT, null);输出是
(0.0,0.5019608,0.4,1.0)
(0.0,0.5019608,0.4,1.0)
(0.0,0.5019608,0.4,1.0)
(0.0,0.5019608,0.4,1.0)似乎与GL_RGBA合作得很好。
发布于 2020-02-24 11:18:30
好吧,让我们来做一些或多或少受过教育的猜测:
Input: -1.0,0.5,0.4,2.0 -> Output: -2.0,1.0,0.8,4.0
Input: -10.0,0.5,0.4,20.0 -> Output: -200.0,10.0,8.0,400.0
Input: -1.0,0.5,0.4,2.0 -> Output: 0.0,0.5019608,0.4,1.0 (using UNORM target)假设:您启用了混合,并且特别设置了glBlendFunc(GL_SRC_ALPHA, ...),以便您的片段着色器的输出(这将是混合阶段的源操作数)乘以您提供的alpha值。请注意,当使用像GL_RGBA这样的UNORM渲染目标时,片段着色器的输出将在混合发生之前夹紧到[0,1],因此在那里得到alpha = 1.0,乘法没有任何效果。
如果我的假设是正确的,如果您尝试输入alpha为0.5,您也会得到在GL_RGBA格式情况下的“错误”缩放结果。
https://stackoverflow.com/questions/60372514
复制相似问题