2012-02-24 3 views
1

им пытается получить мульти текстурирования работы и до сих пор есть miltiple текстуры для загрузки с помощью этой функции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 

И я могу установить текстуры для использования с этим кодом

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) будет выбирать текстуру, которая будет использоваться, и она будет отображаться, но смешения не происходит, я просто вижу последнюю выбранную текстуру в рендере. Я попытался добавить 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