首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyOpenGL Texture_3D和Numpy不呈现

PyOpenGL Texture_3D和Numpy不呈现
EN

Stack Overflow用户
提问于 2014-06-09 22:52:58
回答 1查看 820关注 0票数 1

我试图做一个简单的渲染,将TIFF图像中的数据加载到numpy矩阵中,并生成一个三维纹理。Tiff图像是强度图像,我希望将这个强度图像重新映射为亮度或白彩色图像。

虽然我认为我理解GL_Texture_3D的过程,但是没有运行代码的错误,我仍然没有获得可视化的结果。我确实做了一些很简单的错事。有人能帮我理解我的错误吗?

这是更正的代码的一个简短版本:

编辑2:尝试正确地转换类型:,正如Reto所建议的,我可能面临一个强制转换问题。因此,我将numpy数组转换为uint8,确保值与所有零不同,并将其传递给channel_RGBA_buffer uint8 arrray。仍然会产生一个黑色的窗口。

编辑3:使用Glumpy方法:读取Glumpy ( 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而不是纹理。

结果仍然是一个黑色的窗口,但当关闭这个窗口,一瞬间,我看到数据出现。看来我要多加一层了。

代码语言:javascript
复制
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位。

EN

回答 1

Stack Overflow用户

发布于 2014-06-10 03:23:05

我没有使用numpy,但是按照我阅读文档(http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html)的方式,numpy.zeros()默认生成一个float64值数组。然后将GL_INT作为glTexImage3D()的类型参数传递。看来我们这里有一个类型错配。

用于纹理数据的典型数据类型是无符号字节。所以我觉得应该是这样的:

代码语言:javascript
复制
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,或者部分取决于舍入是如何工作的。但是字节范围的值是0-255。在将随机浮动转换为纹理数据时,您可能希望乘以255.0:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24130299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档