我在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);
}
答案 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}命令可用于加载采样器值