2016-06-09 69 views
0

我想将两个纹理传递给我的片段着色器。我用两个2D纹理成功,但没有一个1D和2D。texture1D和纹理2D在同一GLSL着色器中

这里是一块片段着色器代码:

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). 

和 '这里' 不打印

请问,有什么想法?

+0

看起来就像你不能在相同的纹理图像单元使用不同的纹理。你可以用不同的单位设置它们:layout(binding = 0)uniform sampler2D heights;布局(binding = 1)统一sampler2D bboxes;如果你的版本支持它。 – Unick

+0

看来我需要GL_EXT_gpu_shader4扩展 – mike

+0

Oups,抱歉,GL_EXT_gpu没有链接到我的问题。 – mike

回答

1

第一个问题是,你似乎可以用纹理单元2的1D质地:glActiveTexture(GL_TEXTURE0 + 2)

但你是均匀的glUniform1i(loc_bb, 1)

让他们一致设置为1

第二个问题是PyOpenGL包装试图在链接后立即验证着色器,并且不起作用,因为那时您尚未配置Uniforms,因此存在纹理单元的冲突。如果您的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 program 
+0

啊,是的,谢谢。但是,同样的错误:( – mike

+0

编辑答案与应该工作的解决方案 – 246tNt