簡體   English   中英

PyOpenGL Texture_3D和Numpy無法渲染

[英]PyOpenGL Texture_3D and Numpy not rendering

我正在嘗試做一個簡單的渲染,將TIFF圖像中的數據加載到numpy矩陣中並制作3D紋理。 Tiff圖像是強度圖像,我希望將此強度圖像重新映射為亮度或alphacolor圖像。

雖然我認為我了解GL_Texture_3D的過程,但運行代碼沒有錯誤,但我仍然看不到任何視覺效果。 我當然在做一些簡單的非常錯誤的事情。 誰能幫助我理解我的錯誤?

這是代碼的簡短版本[更正]:

編輯2:嘗試正確轉換類型:如Reto Koradi所建議,我可能面臨轉換問題。 因此,我將numpy數組轉換為uint8,以確保值不同於全零,並將其傳遞給channel_RGBA_buffer uint8 arrray。 仍然會產生一個黑色的窗口。

編輯3:使用笨拙的方法:閱讀笨拙的函數“紋理”( https://code.google.com/p/glumpy/source/browse/glumpy/image/texture.py?r=8cbc2aa2b277c07b59fba964edd327370a8e8091 )目標GL格式GL_RGBA到GL_RGBA16,並在調用glTexImage3D之后添加了glBindTexture(GL_TEXTURE_3D,0)。 仍不確定為什么0而不是紋理。

結果仍然是一個黑色的窗口,但是當關閉該窗口時,一會兒,我看到了數據出現。 好像我要多放一層。

import sys

import numpy
from OpenGL.GL import *
from OpenGL.GL.shaders import *
from OpenGL.arrays import vbo
from OpenGL.GLU import *
from OpenGL.GLUT import *
from OpenGL.GLUT.freeglut import *




class test_TIFF_render:

    def __init__(self):
        self.something = True

    def load_texture(self):

        global texture


        #read file as array, for simplicity I will just make a random numpy 3D matrix 
        tiff_mean = numpy.random.rand(3,300,300)
        tiff_mean = tiff_mean*1000
        tiff_mean = tiff_mean.astype('uint8')

    shape_array = tiff_mean.shape
        shape_array = tiff_mean.shape
        #we have the data now, let's set the texture
        tiff_mean = tiff_mean.reshape(tiff_mean.shape[1]*tiff_mean.shape[2]*tiff_mean.shape[0])
        texture = glGenTextures(1)
        glBindTexture(GL_TEXTURE_3D,texture)
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S,GL_CLAMP_TO_BORDER)
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_BORDER)
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R,GL_CLAMP_TO_BORDER)
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

        #now we need to convert the intensity data organized in 3D matrix into an RGBA buffer array (pixel1R, pixel1G, pixel1B, pixel1A, pixel2R....)
        channel_RGBA_buffer = numpy.zeros(tiff_mean.shape[0]*4, numpy.uint8)

        for i in range(0,tiff_mean.shape[0]):
            channel_RGBA_buffer[i*4] = tiff_mean[i]     #R
            channel_RGBA_buffer[i*4+1] = tiff_mean[i]   #G
            channel_RGBA_buffer[i*4+2] = tiff_mean[i]   #B
            channel_RGBA_buffer[i*4+3] = tiff_mean[i]   #A
            if numpy.mod(i,100000)==0:
                print('count %d',i)


        glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA16, shape_array[1], shape_array[2], shape_array[0], 0, GL_RGBA, GL_UNSIGNED_BYTE, channel_RGBA_buffer)
glBindTexture( GL_TEXTURE_3D, 0 )

    def display(self):

        glClear( GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT )

        glEnable( GL_ALPHA_TEST )
        glAlphaFunc( GL_GREATER, 0.03)

        glEnable(GL_BLEND)
        glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA )

        glMatrixMode( GL_TEXTURE )
        glLoadIdentity()



        glEnable(GL_TEXTURE_3D);
        glBindTexture( GL_TEXTURE_3D, texture);
        dOrthoSize = 1
        for Indx in self.my_range(-1,1,0.01):
            TexIndex = round(Indx,2)
            glBegin(GL_QUADS)
            glTexCoord3f(0.0, 0.0, (TexIndex+1.0)/2.0)
            glVertex3f(-dOrthoSize,-dOrthoSize,TexIndex)
            glTexCoord3f(1.0, 0.0, (TexIndex+1.0)/2.0)
            glVertex3f(dOrthoSize,-dOrthoSize,TexIndex)
            glTexCoord3f(1.0, 1.0, (TexIndex+1.0)/2.0)
            glVertex3f(dOrthoSize,dOrthoSize,TexIndex)
            glTexCoord3f(0.0, 1.0, (TexIndex+1.0)/2.0)
            glVertex3f(-dOrthoSize,dOrthoSize,TexIndex);
            glEnd()

        glBindTexture( GL_TEXTURE_3D, texture )

    def my_range(self,start, end, step):
        while start <= end:
            yield start
            start += step

glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA)

glutInitWindowSize(300,300)
window = glutCreateWindow(b"I really hope this works")


test111 = test_TIFF_render()
test111.load_texture()

glutDisplayFunc(test111.display)
glutMainLoop()

我正在使用Python3.3運行Win7 64位。

我沒有用過numpy,但是我閱讀文檔的方式( http://docs.scipy.org/doc/numpy/reference/produced/numpy.zeros.html ), numpy.zeros()產生float64數組默認值。 然后,將GL_INT傳遞為glTexImage3D()的類型參數。 看起來我們這里的類型不匹配。

用於紋理數據的典型數據類型是無符號字節。 所以我認為它應該看起來像這樣:

channel_RGBA_buffer = numpy.zeros(tiff_mean.shape[0]*4, numpy.uint8)
...
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, shape_array[1], shape_array[2], shape_array[0], 0,
             GL_RGBA, GL_UNSIGNED_BYTE, channel_RGBA_buffer)

編輯,更新新版本的代碼:好像您知道生成0.0到1.0之間的隨機浮點值,將它們轉換為字節( uint8 )值,然后將其用於紋理數據。 我相信這將導致您的所有字節值均為0,或者可能部分為1,具體取決於舍入的方式。 但是字節范圍的值為0-255。 將隨機浮點數轉換為紋理數據時,可能要乘以255.0:

channel_RGBA_buffer[i*4] = 255.0 * tiff_mean[i]     #R
channel_RGBA_buffer[i*4+1] = 255.0 * tiff_mean[i]   #G
channel_RGBA_buffer[i*4+2] = 255.0 * tiff_mean[i]   #B
channel_RGBA_buffer[i*4+3] = 255.0 * tiff_mean[i]   #A

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM