2013-12-23 3 views
2

Я пытаюсь создать класс, чтобы ускорить производство текстурированных полигонов в моей программе, но текстура не отображается.OpenGL 3.2 Texture Not Displaying

Я использую LWJGL с Slick2D для загрузки текстуры.

Это мой TexturedPolygon класс:

package zeus.core.geom; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.FloatBuffer; 
import java.util.ArrayList; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.opengl.GL11; 
import org.lwjgl.opengl.GL15; 
import org.lwjgl.opengl.GL20; 
import org.lwjgl.opengl.GL30; 
import org.lwjgl.util.vector.Vector2f; 
import org.newdawn.slick.opengl.Texture; 
import org.newdawn.slick.opengl.TextureLoader; 

import zeus.core.Disposable; 

public class TexturedPolygon extends Disposable { 

    private final List<Float> vertices = new ArrayList<Float>(); 
    private final List<Float> texCoords = new ArrayList<Float>(); 
    private final int VAO, VBO; 
    private final FloatBuffer vertBuffer; 
    private final ByteBuffer texBuffer; 
    private final int GL_DRAWING_MODE; 
    private final String IMG_FILE; 
    private final Texture TEXTURE; 

    public TexturedPolygon(final LinkedHashMap<Vector2f, Vector2f> info, final String IMG_FILE, final int GL_DRAWING_MODE) throws IOException { 

     this.IMG_FILE = IMG_FILE; 
     this.GL_DRAWING_MODE = GL_DRAWING_MODE; 
     this.TEXTURE = TextureLoader.getTexture(".png", new FileInputStream(new File(System.getProperty("user.dir") + "/res/img/", IMG_FILE))); 

     for(Map.Entry<Vector2f, Vector2f> entry : info.entrySet()) { 
      vertices.add(entry.getKey().x); 
      vertices.add(entry.getKey().y); 

      texCoords.add(entry.getValue().x); 
      texCoords.add(entry.getValue().y); 
     } 

     vertBuffer = BufferUtils.createFloatBuffer(vertices.size()); 

     final float[] vertArray = new float[vertices.size()]; 
     int i = 0; 
     for(final float f : vertices) { 
      vertArray[i++] = f; 
     } 

     vertBuffer.put(vertArray); 
     vertBuffer.flip(); 

     VAO = GL30.glGenVertexArrays(); 
     GL30.glBindVertexArray(VAO); 

     VBO = GL15.glGenBuffers(); 
     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBO); 
     GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuffer, GL15.GL_STATIC_DRAW); 
     GL20.glEnableVertexAttribArray(0); 

     GL20.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0); 
     GL30.glBindVertexArray(VAO); 

     GL11.glBindTexture(GL11.GL_TEXTURE_2D, TEXTURE.getTextureID()); 

     texBuffer = BufferUtils.createByteBuffer(TEXTURE.getTextureData().length); 
     texBuffer.put(TEXTURE.getTextureData()); 
     texBuffer.flip(); 

     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, TEXTURE.getTextureID()); 
     GL15.glBufferData(GL15.GL_ARRAY_BUFFER, texBuffer, GL15.GL_STATIC_DRAW); 
     GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false, 0, 0); 
     GL20.glEnableVertexAttribArray(1); 

    } 

    public void draw() { 
     GL30.glBindVertexArray(VAO); 
     GL11.glDrawArrays(GL_DRAWING_MODE, 0, vertices.size()); 
     GL30.glBindVertexArray(0); 
    } 

    public void update(final int delta) { 

    } 

    @Override 
    public void dispose() { 
     GL20.glDisableVertexAttribArray(0); 

     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
     GL15.glDeleteBuffers(VBO); 

     GL30.glBindVertexArray(0); 
     GL30.glDeleteVertexArrays(VAO); 

     GL11.glBindTexture(GL11.GL_TEXTURE_2D, TEXTURE.getTextureID()); 
    } 

    public int getVAO() { 
     return VAO; 
    } 

    public int getVBO() { 
     return VBO; 
    } 

    public int getDrawingMode() { 
     return GL_DRAWING_MODE; 
    } 

    public FloatBuffer getVertBuffer() { 
     return vertBuffer; 
    } 

    public ByteBuffer getTextureBuffer() { 
     return texBuffer; 
    } 

    public List<Float> getVertices() { 
     return vertices; 
    } 

    public List<Float> getTexCoords() { 
     return texCoords; 
    } 

    public String getImageFilename() { 
     return IMG_FILE; 
    } 

} 

Это мой основной класс:

package tests; 

import java.util.LinkedHashMap; 

import org.lwjgl.opengl.GL11; 
import org.lwjgl.opengl.GL20; 
import org.lwjgl.util.vector.Vector2f; 

import zeus.core.Window; 
import zeus.core.geom.TexturedPolygon; 
import zeus.core.opengl.Shader; 
import zeus.core.opengl.ShaderProgram; 

public class WindowTest { 

    public static void main(String[] args) throws Exception { 

     final Window win = new Window(800, 600, "Window Test"); 

     win.create(); 

     Shader vertexShader = new Shader("drawing_test_vertex", GL20.GL_VERTEX_SHADER); 
     Shader fragmentShader = new Shader("drawing_test_fragment", GL20.GL_FRAGMENT_SHADER); 
     ShaderProgram program = new ShaderProgram(); 

     vertexShader.compile(); 
     fragmentShader.compile(); 

     LinkedHashMap<Vector2f, Vector2f> info = new LinkedHashMap<Vector2f, Vector2f>(); 

     info.put(new Vector2f(0f, 0f), new Vector2f(0f, 0f)); 
     info.put(new Vector2f(1f, 0f), new Vector2f(1f, 0f)); 
     info.put(new Vector2f(1f, 1f), new Vector2f(1f, 1f)); 

     info.put(new Vector2f(1f, 1f), new Vector2f(1f, 1f)); 
     info.put(new Vector2f(0f, 1f), new Vector2f(0f, 1f)); 
     info.put(new Vector2f(0f, 0f), new Vector2f(0f, 0f)); 

     TexturedPolygon p = new TexturedPolygon(info, "test.png", GL11.GL_TRIANGLES); 

     program.addShader(vertexShader); 
     program.addShader(fragmentShader); 

     program.link(); 
     program.use(); 

     while(!win.isCloseRequested()) { 
      win.clear(); 

      p.update(1); 
      p.draw(); 

      win.update(120); 
     } 

     p.dispose(); 

     vertexShader.dispose(); 
     fragmentShader.dispose(); 
     program.dispose(); 

     win.dispose(); 

    } 

} 

И это мои шейдерных файлы:

Vertex:

#version 410 

layout(location=0) vec3 pos; 
layout(location=1) vec2 tex; 

out smooth vec2 Tex; 

void main() { 
    gl_Position = vec4(pos, 1.0f); 
    Tex = tex; 
} 

Фрагмент:

#version 410 

layout(location=0) vec2 Tex; 

uniform sampler2D textureDiffuse; 

out vec4 color; 

void main() { 
    color = texture(textureDiffuse, Tex); 
} 

Я понятия не имею, что вызывает проблему.

Это то, что в настоящее время отображения: Current Result

Цвета здесь меняется, когда я изменить размер «» спор между 1 и 4 на этой линии:

GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false, 0, 0); 

ответ

0

Я не проверил все вашего кода, но ваши шейдеры сломаны. Вы не объявляете правильные переменные in, поэтому вы используете базовые значения неинициализированных данных. Эти шейдеры даже скомпилированы с квалификаторами layout для глобальных переменных?

вершинный шейдер должен быть изменен на:

layout(location=0) in vec3 pos; 
layout(location=1) in vec2 tex;

и аналогично для пиксельный шейдер:

in vec2 Tex;

Обратите внимание, что места имеют отношение только в тех случаях, когда некоторые хост < -> GL связи (например, униформы, атрибуты вершин и выходы фрагмента шейдера), но нет мест для входов и выходов шейдеров, которые являются внутренними для конвейера GL, поэтому вы не можете объявить местоположение для входов фрагментарного шейдера. Эти переменные сопоставляются именами.