Opengl 3d纹理采样

时间:2018-02-20 13:51:40

标签: c++ opengl textures

我正在尝试创建一个由随机值网格组成的3d纹理,但每当我在片段着色器中进行采样时,我只得到一个非常小的值 - 即使我只是将其设置为0.5的网格或类似的东西!

这就是我尝试这样做的方式:

static GLuint noise_tex = 0;

//create grid of random numbers:
int tex_width = 256;
int tex_height = 256;
int tex_depth = 256;
int tex_size = tex_width*tex_height*tex_depth;
GLfloat* noise_data = new GLfloat[tex_size];
for (int i = 0; i < tex_size; i++){
      noise_data[i] = static_cast <GLfloat> (rand()) / static_cast <GLfloat> (RAND_MAX);
}

//create and bind texture
glGenTextures(1, &noise_tex);
glBindTexture(GL_TEXTURE_3D,noise_tex);

//set filtering and wrapping
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);

glTexImage3D(GL_TEXTURE_3D, 0, GL_R16F, tex_width, tex_height, tex_depth, 0, GL_RED, GL_FLOAT, noise_data);

在片段着色器中(不是我最后要做的,只是为了看看高度有什么价值):

 in vec3 pos;

 uniform sampler3D noise_tex;

 out vec4 fragColor;

 void main()
 {

     float height = texture(noise_tex, pos).r;

     if(height<0.000001){
         fragColor = vec4(1.0, 1.0,1.0,1.0);
     }
     else if .... etc

 }

我没有创建任何纹理坐标,但我只是假设它在使用GL_repeat和GL_linear时会起作用 - 我知道pos位于间隔pos.x:200-300,po​​s.y:200-300, pos.z:0-10,所以我也考虑将这些值映射到0-1,但这似乎也不是问题。

0 个答案:

没有答案