2013-05-14 30 views
1

以下代碼用於繪製海洋,我試圖將其轉換爲c#代碼,但由於我不理解什麼是3d函數,因此我失敗了,所以我想對這些函數進行一些解釋(3D紋理我的意思)...OPENGL如何使用glTexImage3D函數

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

三維紋理是體積圖像,即他們是一種立方體填充顏色的體素。所以,而不是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和實施海洋渲染器的數值方法是幾乎不可能執行的任務。我首先從理解基礎知識開始。