2011-11-10 7 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 : 셰이더없이 완전한 텍스처를 생성 할 수 있습니다. 그러나 셰이더 없이는 (그림자로 렌더링) 접근 할 수 없습니다. 고정 기능 파이프 라인에는 통합 텍스처에 대한 작업을 수행 할 수있는 기능이 없습니다. 어떻게 만드는지는 중요하지 않습니다. 하지만 실제로 그걸로 무언가를하고 싶다면 셰이더가 필요합니다. –

관련 문제