我想把两个纹理传递给我的片段着色器。我成功的两个二维纹理,但不是一个一维和一个2D。
下面是片段着色器代码的一部分:
uniform sampler2D heights;
uniform sampler1D bboxes;
....
vec4 t2 = texture2D(heights, vec2(0.0, 0.0));
vec4 t1 = texture1D(bboxes, 0.0);这里有一段主程序代码(请注意“打印在这里”):
sh = shaders.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER)
shaders.glUseProgram(sh)
print 'here'
glEnable(GL_TEXTURE_2D)
glEnable(GL_TEXTURE_1D)
glActiveTexture(GL_TEXTURE0)
glPixelStorei(GL_UNPACK_ALIGNMENT,1)
t_h = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, t_h)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 800, 600, 0, GL_RGB, GL_FLOAT, pts)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glActiveTexture(GL_TEXTURE0 + 2)
glPixelStorei(GL_UNPACK_ALIGNMENT,1)
t_bb = glGenTextures(1)
glBindTexture(GL_TEXTURE_1D, t_bb)
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB32F, len(bboxes), 0, GL_RGB, GL_FLOAT, bboxes)
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
loc_h = glGetUniformLocation(sh, "heights")
loc_bb = glGetUniformLocation(sh, "bboxes")
glUniform1i(loc_h, 0)
glUniform1i(loc_bb, 1)我的错误是:
File "forth.py", line 282, in <module>
shader = setup()
File "forth.py", line 128, in setup
sh = shaders.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER)
File "/Library/Python/2.7/site-packages/PyOpenGL-3.0.2-py2.7.egg/OpenGL/GL/shaders.py", line 196, in compileProgram
program.check_validate()
File "/Library/Python/2.7/site-packages/PyOpenGL-3.0.2-py2.7.egg/OpenGL/GL/shaders.py", line 108, in check_validate
glGetProgramInfoLog( self ),
RuntimeError: Validation failure (0): Validation Failed: Sampler error:
Samplers of different types use the same texture image unit.
- or -
A sampler's texture unit is out of range (greater than max allowed or negative).“这里”没有打印出来。
拜托,知道吗?
发布于 2016-06-09 18:40:24
第一个问题是,您似乎在使用纹理单元2进行一维纹理:glActiveTexture(GL_TEXTURE0 + 2)。
但是你把制服设置为1和glUniform1i(loc_bb, 1)
让他们保持一致。
第二个问题是,PyOpenGL包装程序试图在链接后立即验证着色器,但这不起作用,因为此时还没有配置制服,因此纹理单元之间存在冲突。如果您的GLSL版本不支持layout设置默认绑定,则不可能进行验证。
我看到的唯一方法是创建自己的助手函数来编译程序并跳过“验证”步骤:
from OpenGL.GL.shaders import ShaderProgram
def myCompileProgram(*shaders):
program = glCreateProgram()
for shader in shaders:
glAttachShader(program, shader)
program = ShaderProgram( program )
glLinkProgram(program)
program.check_linked()
for shader in shaders:
glDeleteShader(shader)
return programhttps://stackoverflow.com/questions/37728487
复制相似问题