2011-11-10 56 views
1

我希望使用整數內部格式創建和操作紋理(用於與opencl進一步互操作)。但是,似乎我錯過了重要的映射這個紋理的問題。這是一個代碼示例,它會說更多。內部格式可以通過定義INTERNAL和DATACOPY變量來切換。使用整數內部格式渲染紋理

它工作得很好,如果我使用浮點標準化內部格式(GL_RGBA,GL_RGBA)紋理。示例代碼將繪製嘈雜的彩色圖像。但是一旦我切換到(GL_RGBA8UI,GL_RGBA_INTEGER)窗口就變黑了。

可能問題只在於我的配置(nvidia fermi-arch)。所以,任何幫助指出我的問題的根源是值得讚賞的。

import pygame 
    from OpenGL.GL import * 
    import os 

    XLEN, YLEN = 320, 200 

    INTERNAL, DATACOPY = GL_RGBA, GL_RGBA 
    #INTERNAL, DATACOPY = GL_RGBA8UI, GL_RGBA_INTEGER 


    pygame.init() 
    pygame.display.set_mode((XLEN, YLEN), pygame.DOUBLEBUF | pygame.OPENGL, 24) 

    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(0, XLEN, YLEN, 0, -1, 1) 

    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 

    glDisable(GL_DEPTH_TEST) 

    tex = glGenTextures(1) 
    glBindTexture(GL_TEXTURE_2D, tex) 
    glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL, 256, 256, 0, DATACOPY, GL_UNSIGNED_BYTE, os.urandom(4 * XLEN * YLEN)) 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 

    running = True 
    while running: 
      for event in pygame.event.get(): 
        if event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE: 
          running = False 

      glClearColor(0.0, 0.0, 0.0, 0.0) 
      glClear(GL_COLOR_BUFFER_BIT) 
      glEnable(GL_TEXTURE_2D) 

      glBegin(GL_QUADS) 

      glTexCoord2f(0.0, 0.0) 
      glVertex2f(0.0, 0.0) 

      glTexCoord2f(1.0, 0.0) 
      glVertex2f(XLEN, 0.0) 

      glTexCoord2f(1.0, 1.0) 
      glVertex2f(XLEN, YLEN) 

      glTexCoord2f(0.0, 1.0) 
      glVertex2f(0.0, YLEN) 

      glEnd() 

      glDisable(GL_TEXTURE_2D) 

      pygame.display.flip() 

    glDeleteTextures(tex) 

    pygame.quit()   

回答

2

你的着色器在哪裏?沒有着色器,您不能使用整體紋理。你可能在某處出現了OpenGL錯誤。

+0

我打算使用opencl內核生成紋理。但是之前測試了一下。是否有可能從主機內存上傳紋理數據?或者它只能使用着色器生成? – reddot

+1

@reddot:您可以創建不帶着色器的整體紋理。但是你不能在沒有着色器的情況下訪問它(渲染)。固定功能流水線沒有用於對整體紋理進行操作的設施。你如何創建它並不重要;但是如果你想用它做一些事情,你需要着色器。 –