2016-08-28 8 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() 

そして、ここでは、メインですループ:

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

あなたの実際のコードを持ついくつかの問題があります。

  • あなたのテクスチャをロードするためのメソッドを呼び出していないが。
  • あなたは、キューブの唯一の線を描画している、あなたはテクスチャ座標で三角形またはクワッドのいずれかを使用して意味し、実際のテクスチャで埋めなければポリゴンを必要としています。上記のコードは、ベストプラクティスを使用していないが、それはあなたのコメントの問題のお手伝いをします

    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() 
    

    :あなたはpygameのイベントに

を処理していないここにあなたのコードのいくつかの変更だ

  • 一つアドバイスしかし、私はすべてが意味を作り始めるだろうどのようにグラフィックス・パイプライン工事、その後、理解しようと、あなたは、インターネットからランダムにいくつかのコードをダンプする前に、いくつかのOpenGLチュートリアルを行くお勧めします。また、私はあなたの代わりに古いopengl fixed pipeline

  • +0

    オーケー使用についてmodern Opengl学ぶお勧めしたいので、私はその後、glTexCoordがありませんでした。ありがとうございました。私はいくつかのチュートリアルを通して自分のやり方を進めています。私はこのことにハングアップしました。私はもう少し理解し始めています。まず一般的なチュートリアルを試してみましょう。 –

    関連する問題