[英]Access to 3D array in fragment shader
我正在嘗試使用PyOpenGL從Python程序向片段着色器提供對標量數據的三維數組的訪問。
在片段着色器中,我聲明了一個3d采樣器制服
uniform sampler3D vol;
在Python程序中,我有以下代碼來設置標量3D紋理
vol = numpy.random.rand(3, 3, 3).astype(np.float32)
texture = glGenTextures(1)
glUniform1i(glGetUniformLocation(program, "vol"), 0)
glActiveTexture(GL_TEXTURE0 + 0)
glBindTexture(GL_TEXTURE_3D, texture)
glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, 3, 3, 3, 0, GL_RED, GL_FLOAT, vol)
glEnable(GL_TEXTURE_3D)
但是,無論采樣器在哪里,我都會采用值,例如
color = texture(vol, vec3(0, 0, 0));
似乎我總是獲得黑色(0,0,0)。
我究竟做錯了什么?
我知道我的片段着色器的基本設置有效,即如果我寫color = vec3(1, 0, 0)
我得到紅色像素。
我也知道沒有OpenGL錯誤,因為我正在使用由glutInit()
處理的選項-glerror
運行程序,這導致OpenGL錯誤被轉換為Python異常。
那是因為你GL_RED
紋理格式被鉗位范圍<0,1>
要解決此問題,您需要使用非鉗位紋理格式或禁用鉗位...這里的示例適用於我的GL實現:
這里提取的格式:
glTexImage3D(GL_TEXTURE_3D, 0, GL_R16F, xs,ys,zs, 0, GL_RED, GL_FLOAT, dat);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, size, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, pdata);
對於標量數據,我會使用第一個選項。 有更多的格式沒有被限制只是試着看...
我從來沒有使用過禁用鉗位功能但是在研究類似問題時看到了這個代碼(不確定它是否有效):
glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_READ_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE);
理論上你可以使用任何紋理格式......
要驗證您可以使用此:
另外,我沒有看到紋理集的任何參數。 我希望這樣的事情:
glBindTexture(GL_TEXTURE_3D,txrvol);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
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);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);
避免插入亂碼數據的非精確紋理坐標...
我想出了問題:顯然GL_TEXTURE_3D默認為mipmapped,我只提供了0級,並且(我不清楚)是否選擇了另一個級別。 該問題由glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.