2016-08-28 57 views
0

我努力学习OpenGL的,我已经经历了很多装载纹理的教程,但每一个似乎错过了最重要的一步:我怎么居然把纹理上的东西吗?OpenGL:如何将纹理应用于此多维数据集?

我使用Python这一点,这里是我的函数加载纹理:

def loadTexture(): 
    textureSurface = pygame.image.load('test_image.png') 
    textureData = pygame.image.tostring(textureSurface,"RGBA",1) 
    width = textureSurface.get_width() 
    height = textureSurface.get_height() 

    glEnable(GL_TEXTURE_2D) 
    texid = glGenTextures(1) 

    glBindTexture(GL_TEXTURE_2D, texid) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData) 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) 

    return texid 

这里是装入我的魔方功能:

vertices = (
     # x y z 
     (1,-1,-1), 
     (1, 1,-1), 
     (-1, 1,-1), 
     (-1,-1,-1), 
     (1,-1, 1), 
     (1, 1, 1), 
     (-1,-1, 1), 
     (-1, 1, 1) 
     ) 

edges = (
     (0,1), 
     (0,3), 
     (0,4), 
     (2,1), 
     (2,3), 
     (2,7), 
     (6,3), 
     (6,4), 
     (6,7), 
     (5,1), 
     (5,4), 
     (5,7) 
     ) 

def Cube(): 
    glBegin(GL_LINES) 
    for edge in edges: 
     glColor3fv((1,1,1)) 
     for vertex in edge: 
      glVertex3fv(vertices[vertex]) 
    glEnd() 

而这里的主loop:

pygame.init() 
display = (800,600) 
screen = pygame.display.set_mode(display, DOUBLEBUF | OPENGL | OPENGLBLIT) 

gluPerspective(45, display[0]/display[1],0.1,50.0) 
glTranslatef(0.0,0.0,-5) 

while True: 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

    Cube() 

    pygame.display.flip() 
    pygame.time.wait(10) 

但是该立方体是无纹理的。我不知道如何实际使用加载的纹理立方体,每一个纹理教程中,我发现我需要尽可能的loadTexture功能,而无需实际告诉我如何使用它。我在哪里打电话?我该怎么处理texid?

回答

4

没有与您的实际代码几个问题:

  • 你不打电话来加载纹理的方法。
  • 你只画立方体的线,你需要多边形与实际的纹理,这意味着无论是使用三角形或四边形与纹理坐标被填满。
  • 你不处理pygame的事件

这里是你的代码的一些修改:

import pygame 
import sys 
from OpenGL.GL import * 
from OpenGL.GLU import * 

vertices = (
    # x y z 
    (1, -1, -1), 
    (1, 1, -1), 
    (-1, 1, -1), 
    (-1, -1, -1), 
    (1, -1, 1), 
    (1, 1, 1), 
    (-1, -1, 1), 
    (-1, 1, 1) 
) 

edges = (
    (0, 1), 
    (0, 3), 
    (0, 4), 
    (2, 1), 
    (2, 3), 
    (2, 7), 
    (6, 3), 
    (6, 4), 
    (6, 7), 
    (5, 1), 
    (5, 4), 
    (5, 7) 
) 


def loadTexture(): 
    textureSurface = pygame.image.load('test_image.png') 
    textureData = pygame.image.tostring(textureSurface, "RGBA", 1) 
    width = textureSurface.get_width() 
    height = textureSurface.get_height() 

    glEnable(GL_TEXTURE_2D) 
    texid = glGenTextures(1) 

    glBindTexture(GL_TEXTURE_2D, texid) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 
       0, GL_RGBA, GL_UNSIGNED_BYTE, textureData) 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) 

    return texid 


def draw_cube(lines=False): 
    if lines: 
     glBegin(GL_LINES) 
     for edge in edges: 
      glColor3fv((1, 1, 1)) 
      for vertex in edge: 
       glVertex3fv(vertices[vertex]) 
     glEnd() 
    else: 
     glBegin(GL_QUADS) 
     glTexCoord2f(0.0, 0.0) 
     glVertex3f(-1.0, -1.0, 1.0) 
     glTexCoord2f(1.0, 0.0) 
     glVertex3f(1.0, -1.0, 1.0) 
     glTexCoord2f(1.0, 1.0) 
     glVertex3f(1.0, 1.0, 1.0) 
     glTexCoord2f(0.0, 1.0) 
     glVertex3f(-1.0, 1.0, 1.0) 
     glTexCoord2f(1.0, 0.0) 
     glVertex3f(-1.0, -1.0, -1.0) 
     glTexCoord2f(1.0, 1.0) 
     glVertex3f(-1.0, 1.0, -1.0) 
     glTexCoord2f(0.0, 1.0) 
     glVertex3f(1.0, 1.0, -1.0) 
     glTexCoord2f(0.0, 0.0) 
     glVertex3f(1.0, -1.0, -1.0) 
     glTexCoord2f(0.0, 1.0) 
     glVertex3f(-1.0, 1.0, -1.0) 
     glTexCoord2f(0.0, 0.0) 
     glVertex3f(-1.0, 1.0, 1.0) 
     glTexCoord2f(1.0, 0.0) 
     glVertex3f(1.0, 1.0, 1.0) 
     glTexCoord2f(1.0, 1.0) 
     glVertex3f(1.0, 1.0, -1.0) 
     glTexCoord2f(1.0, 1.0) 
     glVertex3f(-1.0, -1.0, -1.0) 
     glTexCoord2f(0.0, 1.0) 
     glVertex3f(1.0, -1.0, -1.0) 
     glTexCoord2f(0.0, 0.0) 
     glVertex3f(1.0, -1.0, 1.0) 
     glTexCoord2f(1.0, 0.0) 
     glVertex3f(-1.0, -1.0, 1.0) 
     glTexCoord2f(1.0, 0.0) 
     glVertex3f(1.0, -1.0, -1.0) 
     glTexCoord2f(1.0, 1.0) 
     glVertex3f(1.0, 1.0, -1.0) 
     glTexCoord2f(0.0, 1.0) 
     glVertex3f(1.0, 1.0, 1.0) 
     glTexCoord2f(0.0, 0.0) 
     glVertex3f(1.0, -1.0, 1.0) 
     glTexCoord2f(0.0, 0.0) 
     glVertex3f(-1.0, -1.0, -1.0) 
     glTexCoord2f(1.0, 0.0) 
     glVertex3f(-1.0, -1.0, 1.0) 
     glTexCoord2f(1.0, 1.0) 
     glVertex3f(-1.0, 1.0, 1.0) 
     glTexCoord2f(0.0, 1.0) 
     glVertex3f(-1.0, 1.0, -1.0) 
     glEnd() 

pygame.init() 
display = (800, 600) 
screen = pygame.display.set_mode(
    display, pygame.DOUBLEBUF | pygame.OPENGL | pygame.OPENGLBLIT) 

loadTexture() 

gluPerspective(45, display[0]/display[1], 0.1, 50.0) 
glTranslatef(0.0, 0.0, -5) 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

    draw_cube(lines=False) 

    pygame.display.flip() 

上面的代码没有使用最好的做法,但它会帮助你与你的问题发表了评论。

一个建议,虽然,我建议你去通过一些OpenGL的教程从互联网上随意倾倒一些代码之前,试着去了解如何在图形管线工程,那么一切都将开始制作感。另外,我建议你了解modern Opengl而不是使用旧opengl fixed pipeline

+0

好了,所以我错过了glTexCoord然后。谢谢。我正在通过一些教程工作,并且我挂上了这个东西。我开始更多地理解它。我会先尝试一些更一般的教程。 –

相关问题