簡體   English   中英

為什么對於兩個不同的采樣器,出現“紋理單元0同時作為sampler2D和samplerCube訪問”?

[英]Why do I get “Texture unit 0 is accessed both as sampler2D and samplerCube” for two different samplers?

我有以下OpenGL / Python代碼:

import sys

from OpenGL.GL import *
from OpenGL.GL import shaders
from OpenGL.GLU import *
from OpenGL.GLUT import *

glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(640, 480)
window = glutCreateWindow("Test")

print glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS)
print glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS)
print glGetIntegerv(0x8872)
print glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS)

fs = (
"""
#version 130

uniform sampler2D foo;
uniform samplerCube bar;

void main()
{
    vec4 c1 = texture2D(foo, vec2(0, 0));
    vec4 c2 = textureCube(bar, vec3(0, 0, 0));
    gl_FragColor = c1 + c2;
}
"""
)

shader = shaders.compileShader(fs, GL_FRAGMENT_SHADER)
program = shaders.compileProgram(shader)
print program

當我運行它時,片段着色器無法編譯:

$ python tex.py 
16
16
16
48
Traceback (most recent call last):
  File "tex.py", line 35, in <module>
    program = shaders.compileProgram(shader)
  File "/usr/local/lib/python2.7/dist-packages/OpenGL/GL/shaders.py", line 196, in compileProgram
    program.check_validate()
  File "/usr/local/lib/python2.7/dist-packages/OpenGL/GL/shaders.py", line 108, in check_validate
    glGetProgramInfoLog( self ),
RuntimeError: Validation failure (0): Texture unit 0 is accessed both as sampler2D and samplerCube

我不明白為什么兩個采樣器對象會綁定到相同的紋理單元? 使用GLSL 1.30,我什至看不到如何在編譯程序之前指定紋理單位。 並且應該可以使用多個采樣器和紋理單元。

我究竟做錯了什么?

您可能將采樣器的默認值保留為默認值,或者將其中一個設置為0。 這顯然是錯誤的。

您的繪圖紋理綁定代碼應如下所示:

glActiveTexture(GL_TEXTURE0 + x)
glBindTexture(GL_TEXTURE_2D, …)
glUniform1i(uniform_location_of_foo, x)


glActiveTexture(GL_TEXTURE0 + y)
glBindTexture(GL_TEXTURE_CUBE_MAP, …)
glUniform1i(uniform_location_of_bar, y)

即,采樣器統一整數值必須對應於已將匹配紋理目標綁定到的紋理單元。

我最近才剛開始學習OpenGL,所以我對它的所有來龍去脈都不熟悉。 但是,我遇到了同樣的問題,這是因為在將制服分配給各自的單元之前,我試圖驗證着色器。 按以下順序完成所有操作后,問題已解決:

        glLinkProgram(m_Program);

        m_Uniforms[DIFFUSE_U]   = glGetUniformLocation(m_Program, "diffuse");
        m_Uniforms[NORMALMAP_U] = glGetUniformLocation(m_Program, "normalMap");
        m_Uniforms[SHADOWMAP_U] = glGetUniformLocation(m_Program, "shadowMap");

        glUseProgram(m_Program);

        glUniform1i(m_Uniforms[DIFFUSE_U], 0);//sets the diffuse sampler to the texture bound as unit 0
        glUniform1i(m_Uniforms[NORMALMAP_U], 1);
        glUniform1i(m_Uniforms[SHADOWMAP_U], 2);

        glValidateProgram(m_Program);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM