1

以下代码用于绘制海洋,我尝试将其转换为 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;
4

1 回答 1

6

3D 纹理是体积图像,即它们是一种充满颜色体素的长方体。所以不是width × height · color_channels你的照片,而是width × height × depth · color_channels.

这是一个显示体积图像的动画(由我所属的研究工作组提供):http ://www.bmo.physik.uni-muenchen.de/~z19/OCTanimation.gif (不幸的是 StackOverflow 没有t 允许链接动画 GIF)。

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

请注意,如果不深入了解 OpenGL 和实现海洋渲染器的数值方法,几乎​​是不可能完成的任务。我首先要了解基础知识。

于 2013-05-14T22:19:35.297 回答