[英]Why does OpenSceneGraph map all Sampler2D to the first texture
[英]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.