2012-02-24 7 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つのパスのピクセルを追加することです

私はこれについてどのように行きますか?

答えて

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