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

标签 ios opengl-es

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

[更新:阅读 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);
}

最佳答案

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

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

将不起作用。

此外,值似乎被交换了,因为您将查找表 0 绑定(bind)到纹理单元 GL_TEXTURE0,并将查找表 1 绑定(bind)到 GL_TEXTURE1。所以正确的调用是:

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

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

Only the Uniform1i{v}commands can be used to load sampler values

关于ios - 在 openGL 中设置和访问多个纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34453146/

相关文章:

ios - 关于 UIColor ,这是一个错误还是什么?

java - 不要在 Java Android Opengl es 2.0 中使用模板

android - 如何在 opengl es 2 的顶点着色器程序中访问其他顶点?

未呈现 Android OpenGL 纹理

opengl - 片段着色器中的 "Interleaved rendering"

ios - 在 iOS 上编译 Phonegap 项目

ios - 合并 SwiftyJSON 嵌套数组

ios - 如何在 React Native 0.60+ 中添加原生模块?

ios - UITableView 禁用某些行的 rowEditActionForRowAtIndexPath

ios - 使用 SpriteKit 的着色器仅注册黑色的 alpha