gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:34:27 29 4
gpt4 key购买 nike

我正在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com