OPENGL如何使用glTexImage3D函数

时间:2013-05-14 22:09:52

标签: c# opengl

以下代码用于绘制海洋,我试图将其转换为c#代码,但我失败了,因为我不明白3d函数做什么,所以我想要对这些函数做一些解释(3d纹理我的意思) ...

int res = 64;
int nr = res / 2;
int nv = res * 2;
int nb = res / 2;
int na = 8;
f = fopen("E:\\New folder\\ConsoleApplication1\\Debug\\data\\inscatter.raw", "rb");
data = new float[nr*nv*nb*na*4];
fread(data, 1, nr*nv*nb*na*4*sizeof(float), f);
fclose(f);
glActiveTexture(GL_TEXTURE0 + INSCATTER_UNIT);
glGenTextures(1, &inscatterTex);
glBindTexture(GL_TEXTURE_3D, inscatterTex);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA16F_ARB, na*nb, nv, nr, 0, GL_RGBA, GL_FLOAT, data);
delete[] data;

1 个答案:

答案 0 :(得分:4)

3D纹理是体积图像,即它们是一种填充有体素的长方体。因此,不是width × height · color_channels的图片,而是width × height × depth · color_channels的图片。

这是一个显示体积图像的动画(研究工作组的Courtsey,我是其成员):http://www.bmo.physik.uni-muenchen.de/~z19/OCTanimation.gif(遗憾的是StackOverflow不允许链接动画GIF)。

我看到了那个人。否则是关于另一篇文章中的海洋渲染。请注意,这是一个非常重要的主题,需要一些非常复杂的算法。使用称为“inscatter”的3D纹理表明,您查找的任何代码都会实现其中一个复杂模型,其中3D纹理用作散射项查找表。

请注意,如果没有实体了解OpenGL,并且实现海洋渲染器的数值方法几乎不可能执行任务。我首先要先了解基础知识。