2012-02-24 2 views
1

메신저 지금까지이 기능 ​​pyopengl 설정 멀티 텍스처 혼합 모드

def loadTexture(name): 

    img = PIL.Image.open(name) # .jpg, .bmp, etc. also work 
    img_data = numpy.array(list(img.getdata()), numpy.int8) 

    id = glGenTextures(1) 
    glPixelStorei(GL_UNPACK_ALIGNMENT,1) 
    glBindTexture(GL_TEXTURE_2D, id) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img_data) 
    return id 

를 사용하여로드 miltiple 질감을 가지고있다 그리고이 코드

glBindTexture(GL_TEXTURE_2D, 1) 
glEnable(GL_TEXTURE_2D) 
에 사용할 텍스처를 설정할 수 있습니다

내 첫 번째 시도는이있다 :

glBindTexture(GL_TEXTURE_2D, 1) 
glEnable(GL_TEXTURE_2D) 
glBegin(GL_TRIANGLES) 
.... 
glEnd() 

glBindTexture(GL_TEXTURE_2D, 3) 
glEnable(GL_TEXTURE_2D) 
glBegin(GL_TRIANGLES) 
.... 
glEnd() 

그래서 내가 두 번 폴리곤을 렌더링과를 선택 이것은 매번 다른 텍스쳐를 사용할 때 glBindTexture (GL_TEXTURE_2D, n)를 호출하면 relivant 텍스쳐가 선택되고 렌더링되지만 블렌딩 자체가 없기 때문에 렌더링에서 마지막으로 선택한 텍스처를 볼 수 있습니다. glEnable (GL_BLEND)을 추가하려고했지만 아무 것도하지 않는 것 같습니다. 내가하고 싶은 무엇

함께 두 개의 패스의 픽셀을 추가하는 것입니다

나는 이것에 대해 어떻게 갈 것인가?

답변

2

여러 번 통과해야합니까? 여기에 평범한 구식의 OpenGL 멀티 텍스쳐링의 예는 다음과 같습니다

import pygame 
from pygame.locals import * 

import numpy 
import numpy.linalg 

from OpenGL.GL import * 
from OpenGL.GL.shaders import * 

RESOLUTION = (800,600) 

POSITIONS = numpy.array([[-1.0, -1.0], [+1.0, -1.0], [-1.0, +1.0], [+1.0, +1.0]], dtype=numpy.float32) 
TEXCOORDS = numpy.array([[0.0, 1.0], [1.0, 1.0], [0.0, 0.0], [1.0, 0.0]], dtype=numpy.float32) 

from PIL import Image 

tex0 = 0 
tex1 = 0 

def loadTexture(path): 
    img = Image.open(path) 
    img = img.convert("RGBA") 
    img_data = numpy.array(list(img.getdata()), numpy.int8) 

    texture = glGenTextures(1) 
    glPixelStorei(GL_UNPACK_ALIGNMENT,1) 
    glBindTexture(GL_TEXTURE_2D, texture) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.size[0], img.size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, img_data) 

    return texture 

def init(): 
    global tex0 
    global tex1 

    tex0 = loadTexture("texture0.png") 
    tex1 = loadTexture("texture1.png") 

    glViewport(0, 0, *RESOLUTION) 

    aspect = RESOLUTION[0]/float(RESOLUTION[1]) 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-aspect, +aspect, -1.0, +1.0, -1.0, +1.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClearColor(0.0, 0.0, 0.0, 1.0); 

    glVertexPointer(2, GL_FLOAT, 0, POSITIONS); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glClientActiveTexture(GL_TEXTURE0); 
    glTexCoordPointer(2, GL_FLOAT, 0, TEXCOORDS); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glClientActiveTexture(GL_TEXTURE1); 
    glTexCoordPointer(2, GL_FLOAT, 0, TEXCOORDS); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

def draw(): 
    glClear(GL_COLOR_BUFFER_BIT); 

    glActiveTexture(GL_TEXTURE0); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, tex0); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

    glActiveTexture(GL_TEXTURE1); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, tex1); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

def main(): 
    pygame.init() 

    screen = pygame.display.set_mode(RESOLUTION, OPENGL | DOUBLEBUF) 

    init() 

    while True: 
     for event in pygame.event.get(): 
      if event.type == QUIT: return 

     draw() 

     pygame.display.flip() 

if __name__ == "__main__": 
    main() 

Texture Combiners에서보세요, 그들은 당신이 찾고있는 효과의 종류를 가능하게 할 수있다. 물론, 오늘날 이런 종류의 예술에 대한 상태는 쉐이더입니다.

+0

이것은 나를 위해 작동하지 않는 것, 나는 tex1의 균일 한 어둡게하는 것 또는 최신 텍스처가 그려지는 것이 무엇이든간에 나타나는 것입니다. –

+0

이상하게, 텍스처가 변조되어야합니다 (즉, 컴포넌트 현명한 곱셈). 이미지 파일을 업로드 할 수 있습니까? 그들이 제대로로드되었는지 확인 하시겠습니까? (나는 어떤 검사도하지 않는다.) – kloffy

+0

또한, 직접 모드로 렌더링하는 경우, 텍스처를 지정하기 위해'glMultiTexCoord (GL_TEXTURE0, ...)'와'glMultiTexCoord (GL_TEXTURE1, ...)'를 사용해야한다. 각 텍스처 단위의 좌표. – kloffy