在openGL中设置和访问多个纹理

时间:2015-12-24 12:54:55

标签: ios opengl-es

我在IOS上使用openGLES做了一些繁重的计算。目前,我正在尝试使用纹理和texelFetch()来实现查找表,并成功制作一个,但一次只能创建一个。如何在glsl中提供多个sampler2d?我尝试了以下代码,但它给出了奇怪的结果。

[更新:阅读official tutorial #13后,我尝试重新格式化代码,但它仍然无效。似乎sampler2d都引用了第一个,即使我检查了数据指针指向不同的内容。]

在OjbC,我尝试了类似的东西

int lookupTabSize = 2000;
GLuint tab0Handle;
glGenTextures(1, &tab0Handle);
glBindTexture(GL_TEXTURE_2D, tab0Handle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, lookupTabSize,1, 0, GL_RED, GL_FLOAT,[self getConstant:0]); // Pointer checked
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLuint tab0ID = glGetUniformLocation(program, "lookupTab0");
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tab0Handle);
glUniform1f(tab0ID,1);

GLuint tab1Handle;
glGenTextures(1, &tab1Handle);
glBindTexture(GL_TEXTURE_2D, tab1Handle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, lookupTabSize,1, 0, GL_RED, GL_FLOAT,[self getConstant:1]); // Pointer checked
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLuint tab1ID = glGetUniformLocation(program, "lookupTab1");
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, tab1Handle);
glUniform1f(tab1ID,0);

在glsl中,我只是输出查找内容,但似乎两个表都引用相同的数据源,尽管它们不应该像我仔细检查引用一样!关于我该如何正确做到的任何想法?一些示例代码将非常感激。

#version 300 es
uniform sampler2D lookupTab0;
uniform sampler2D lookupTab1;
in int InV0;
out float OutV0;
float f(int ptIn){
  float valueSum = 0.0f;
  ivec2 pos = ivec2(ptIn, 0);
  valueSum = valueSum + texelFetch(lookupTab0,pos,0).r;
  valueSum = valueSum + texelFetch(lookupTab1,pos,0).r;
  return valueSum;
}
void main(){
  OutV0 = f(InV0);
}

1 个答案:

答案 0 :(得分:2)

您需要使用glUniform1i()来设置采样器制服。所以这两个电话:

glUniform1f(tab0ID,1);
...
glUniform1f(tab1ID,0);

无效。

此外,值似乎是交换的,因为您将查找表0绑定到纹理单元GL_TEXTURE0,并将查找表1绑定到GL_TEXTURE1。所以正确的电话是:

glUniform1i(tab0ID, 0);
...
glUniform1i(tab1ID, 1);

这是基于第66页的ES 3.0规范" 2.12.6统一值"部分中的以下内容:

  

只有Uniform1i {v}命令可用于加载采样器值