首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在glTexImage2D()中指定glTexImage2D时的奇怪输出

在glTexImage2D()中指定glTexImage2D时的奇怪输出
EN

Stack Overflow用户
提问于 2020-02-24 09:05:54
回答 1查看 553关注 0票数 1

我正在编写一个Java (JOGL)程序,用着色器程序进行一些计算,并且我正在体验来自片段着色器的奇怪的输出值。更具体地说,glGetTexImage()似乎返回缩放的值。

下面是一个简单的片段着色器。

代码语言:javascript
复制
#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。

代码语言:javascript
复制
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()的第三个参数,以获得未夹紧的值。

然后,使用以下代码获取结果:

代码语言:javascript
复制
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);

最后,它们被输出到控制台。

代码语言:javascript
复制
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)的东西。然而,实际输出是

代码语言:javascript
复制
(-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),我得到了

代码语言:javascript
复制
(-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)

我做错什么了吗?如何获得片段着色器的原始输出?

如有任何建议,将不胜感激。

注意:

破片着色机

代码语言:javascript
复制
fs_out_color=vec4(-1.0,0.5,0.4,2.0);

Java代码

代码语言:javascript
复制
glTexImage2D(
        GL4.GL_TEXTURE_2D, 0, GL4.GL_RGBA, 
        TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL4.GL_RGBA, GL4.GL_FLOAT, null);

输出是

代码语言:javascript
复制
(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合作得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-24 11:18:30

好吧,让我们来做一些或多或少受过教育的猜测:

代码语言:javascript
复制
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格式情况下的“错误”缩放结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60372514

复制
相关文章

相似问题

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