【问题标题】:OpenGL texture lookup errorOpenGL纹理查找错误
【发布时间】:2013-04-29 21:25:43
【问题描述】:

执行以下片段着色器时出现错误:

#version 430 core

in vec4 pos;           // <-- input (x,y,z) position normalized to [0, 1] 
in vec4 screenPos;     // <-- input screen position normalized to [-1, 1] 
out vec4 outColor;

uniform sampler3D volumeTex;    // <-- a volume
uniform sampler2D backFaceTex;  // <-- the backface of a cube previously saved to texture

void main()
{
    if(gl_FrontFacing) {
        vec4 front = pos;
        vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0);

        // only one of the following 4 lines is uncommented at a time
        outColor = front;                          // <-- Ok
        outColor = back;                           // <-- Ok
        outColor = texture(volumeTex, front.xyz);  // <-- Ok
        outColor = texture(volumeTex, back.xyz);   // <-- Error
    }
    else {
        discard;
    }
}

正如您从我的 cmets 中看到的那样,该程序运行良好,在前三种情况下渲染了我期望的图像,但在第四种情况下失败了(我唯一需要的)。

没有呈现任何内容,我从主应用程序中的 glGetError() 收到错误。

似乎禁止使用纹素作为另一个纹理提取操作的坐标参数。

谁能告诉我问题出在哪里?

【问题讨论】:

  • glGetError() 的错误是什么?发生在哪个电话上?着色器编译器日志说明了什么?

标签: opengl textures


【解决方案1】:

使用纹理提取的结果作为另一个纹理提取的坐标称为依赖纹理提取,并且是完全有效的(尽管与独立的 fecth 相比它可能对性能产生一些负面影响)。

您的代码中的问题很可能是

vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0);

行,你基本上有一个 (vec2(...) + 1.0) 操作,这是不允许的,应该会导致编译错误。这也可以解释这样一个事实,即没有绘制任何内容,并且在尝试绘制时出现错误(没有有效的程序)。

【讨论】:

    【解决方案2】:

    谢谢你,

    我发现问题出在哪里: 我为 3D 和 2D 采样器使用了相同的纹理单元,这是非法的。 保持代码不变,例如简单地使用纹理单元 0 用于 sampler3D 和纹理单元 1 用于 sampler2D 即可解决问题!

    干杯, 马西莫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      相关资源
      最近更新 更多