在 OpenGL 中对一个输入纹理使用多个 sampler2D

扫描仪

现在我有了这个网站生成的噪声纹理:https ://aeroson.github.io/rgba-noise-image-generator/ 。我想在我的计算着色器中使用 4 个统一采样器从单个噪声纹理中获取 4 个随机 rgba 值。我的计算着色器源代码如下所示:

#version 430 core

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

uniform sampler2D noise_r0;
uniform sampler2D noise_i0;
uniform sampler2D noise_r1;
uniform sampler2D noise_i1;

layout (binding = 0, rgba32f) writeonly uniform image2D tilde_h0k;

layout (binding = 1, rgba32f) writeonly uniform image2D tilde_h0minusk;

uniform int N = 256; 

....

// Box-Muller algorithm
vec2 texCoord = vec2(gl_GlobalInvocationID.xy) / float(N); // Here every invocation refers to a pixel of output image 
float noise00 = clamp(texture(noise_r0, texCoord).r, 0.001, 1.0);
float noise01 = clamp(texture(noise_i0, texCoord).r, 0.001, 1.0);
float noise02 = clamp(texture(noise_r1, texCoord).r, 0.001, 1.0);
float noise03 = clamp(texture(noise_i1, texCoord).r, 0.001, 1.0);

....

在主程序中,我使用此代码将下载的噪声纹理上传到计算着色器:

unsigned int tex_noise;
glGenTextures(1, &tex_noise);
glBindTexture(GL_TEXTURE_2D, tex_noise);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
int w_noise, h_noise, nrChannels;
unsigned char* data = stbi_load("noise.png", &w_noise, &h_noise, &nrChannels, 0);
if (data) {
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w_noise, h_noise, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else std::cout << "Failed to load noise texture." << std::endl;
stbi_image_free(data);
....
....

我的问题是:我可以使用此代码在计算着色器中设置那些 sampler2D 吗?

glUseProgram(computeProgram);
glActiveTexture(GL_TEXTURE1);
glUniform1i(glGetUniformLocation(computeProgram, "noise_r0"), 1);
glActiveTexture(GL_TEXTURE2);
glUniform1i(glGetUniformLocation(computeProgram, "noise_i0"), 2);
glActiveTexture(GL_TEXTURE3);
glUniform1i(glGetUniformLocation(computeProgram, "noise_r1"), 3);
glActiveTexture(GL_TEXTURE4);
glUniform1i(glGetUniformLocation(computeProgram, "noise_i1"), 4);

如果是错误的,我应该如何设置这些 sampler2D,并确保我从这些 sampler2D 获得的随机 rgba 值不一样?(因为如果它们相同,Box-Muller 算法将不起作用)。非常感谢你的帮助!

兔子76

制服的类型是ìmage2D,不是sampler2D要加载和存储图像,您必须使用 . 将纹理绑定到图像单元glBindImageTexture请参阅图像加载存储例如:

glBindImageTexture(1, tex_noise, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);

如果要将纹理绑定到纹理单元,则需要选择活动纹理单元,glActiveTexture然后将纹理绑定glBindTexture

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture_object);

您可以使用统一的类型sampler2Dtexture*功能在着色器中访问此纹理:

layout(binding = 1) uniform sampler2D myTextue;

如果要将纹理绑定到图像单元,则必须使用glBindImageTexture

glBindImageTexture(1, texture_object, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);

您可以使用统一的类型iamge2Dimage*函数在着色器中访问此纹理:

layout (binding = 1, rgba32f) writeonly uniform image2D myImage;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

OpenGL - GLSL 120 中的 Sampler2D 数组?

OpenGL无绑定纹理:绑定到统一的sampler2D数组

OpenGL4无法将纹理加载到Sampler2D中

OpenGL - 在 sampler2D 上使用 Bindless 纹理会禁用 TextureCubeMapSeamless

如何在SPIR-V Shader中的OpenGL中设置sampler2D制服?

在 OpenGL 中使用 sampler2D 数组是否有任何限制

你怎么画一个sampler2D?

如何使用6个sampler2D实现textureCube

在着色器中剪切sampler2D

在Shader中使用Sampler2D的问题

在WebGL的一个着色器中使用sampler2D和samplerCube

为什么 OpenSceneGraph 将所有 Sampler2D 映射到第一个纹理

GLSL:将可变数量的纹理发送到 sampler2D

纹理同时用作着色器程序的 FBO 颜色附件和 sampler2D

WebGL 着色器检查纹理 sampler2D 的状态

无法从 Godot 的着色器中正确读取 FORMAT_R8 统一的 sampler2D 纹理

是否可以安全地假设未设置的sampler2D制服将读取纹理单元0?

如何从着色器中的着色器存储缓冲区对象获取sampler2D类型?

如何在 OpenGL 中将多个纹理/缓冲区混合到一个纹理/缓冲区中?

GLSL sampler2D结构

sampler2D 占用多少位置?

opengl 2d游戏只绘制第二个精灵纹理而不是第一个

缩放纹理opengl 2

如何使用OpenGL在ARCORE中的单个3D对象中加载多个2D纹理

使用颜色图数组在 OpenGL ES 2 中渲染纹理

OpenGL:如何通过一个变量将多个纹理传递给着色器?

从glsl移到金属时如何转换sampler2D?

OpenGL在绘制一个网格时绑定许多纹理

纹理化一个 opengl 立方体