首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个GLSL着色器中的texture1D和纹理2D

在同一个GLSL着色器中的texture1D和纹理2D
EN

Stack Overflow用户
提问于 2016-06-09 14:15:11
回答 1查看 791关注 0票数 0

我想把两个纹理传递给我的片段着色器。我成功的两个二维纹理,但不是一个一维和一个2D。

下面是片段着色器代码的一部分:

代码语言:javascript
复制
uniform sampler2D heights;
uniform sampler1D bboxes;
....
vec4 t2 = texture2D(heights, vec2(0.0, 0.0));
vec4 t1 = texture1D(bboxes, 0.0);

这里有一段主程序代码(请注意“打印在这里”):

代码语言:javascript
复制
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)

我的错误是:

代码语言:javascript
复制
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).

“这里”没有打印出来。

拜托,知道吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-09 18:40:24

第一个问题是,您似乎在使用纹理单元2进行一维纹理:glActiveTexture(GL_TEXTURE0 + 2)

但是你把制服设置为1glUniform1i(loc_bb, 1)

让他们保持一致。

第二个问题是,PyOpenGL包装程序试图在链接后立即验证着色器,但这不起作用,因为此时还没有配置制服,因此纹理单元之间存在冲突。如果您的GLSL版本不支持layout设置默认绑定,则不可能进行验证。

我看到的唯一方法是创建自己的助手函数来编译程序并跳过“验证”步骤:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37728487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档