簡體   English   中英

OpenGL 3.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();

    }

}

這些是我的着色器文件:

頂點:

#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);
}

我不知道是什么引起了問題。

這是當前顯示的內容: 當前結果

當我在此行上將'size'參數在1到4之間更改時,此處的顏色也會更改:

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

我尚未檢查所有代碼,但您的着色器已損壞。 您沒有in變量中聲明正確,所以您基本上使用了未初始化的數據。 這些着色器是否甚至使用全局變量的layout限定符進行編譯?

頂點着色器應更改為:

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

類似於片段着色器:

in vec2 Tex;

請注意,位置僅與某些主機<-> GL通信(例如,制服,頂點屬性和片段着色器輸出)相關,而在GL管道內部沒有用於着色器輸入和輸出的位置,因此您無法聲明片段着色器輸入的位置。 這些變量由名稱匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM