【问题标题】:Cannot use cubemap and 2D texture at the same time不能同时使用立方体贴图和 2D 纹理
【发布时间】:2020-07-13 10:16:01
【问题描述】:

使用 2D 纹理创建阴影贴图,立方体贴图包含辐射。当我从每个获取值并渲染时,它们会正确显示。但是,当我计算这两个值时,只显示 glClearColor() 颜色并且对象消失了。

layout(location = 0) out vec4 color;

in vec2 ShadowTexCoord;

uniform sampler2D ShadowMap;
uniform samplerCube CubeMap;

void main() {
  color = texture2D(ShadowMap, ShadowTexCoord);
}

此结果显示被直射光照亮的区域。

layout(location = 0) out vec4 color;

in vec2 ShadowTexCoord;

uniform sampler2D ShadowMap;
uniform samplerCube CubeMap;

void main() {
  color = texture(CubeMap, WorldPosition - CubePos);
}

此结果显示在预计算中获得的辐射值。

layout(location = 0) out vec4 color;

in vec2 ShadowTexCoord;

uniform sampler2D ShadowMap;
uniform samplerCube CubeMap;

void main() {
  color = texture2D(ShadowMap, ShadowTexCoord) * texture(CubeMap, WorldPosition - CubePos);
}

此结果应仅针对直射光照射范围内的辐射值显示。 它们都给出了正确的结果,但是当我计算它们的每个值时,唯一的结果是 glClearColor()。

可能的因素有哪些?

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    您需要为两个纹理使用不同的纹理单元。即使 GL 中的每个纹理单元对于不同的纹理类型(1D、2D、3D、Cube、1D Array、2D Array、Cube Array 等等)都有不同的绑定槽,也只有 一个 纹理可以在绘制调用期间通过每个纹理单元访问(意味着您在所有着色器阶段中进行的所有纹理访问)。

    因此,如果您同时将 2D 纹理和立方体贴图绑定到单元 0,并执行一次通过 sampler2D 访问单元 0 的绘制调用,然后切换到通过 @ 访问单元 0 的程序,那就没问题了987654322@,但一旦程序尝试通过多个采样器类型访问单元 0,它就会失败。

    【讨论】:

    • 前向渲染后纹理绑定设置出错。感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2014-05-06
    • 2015-10-12
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多