java - OpenGL 3.2 纹理不显示

标签 java shader lwjgl slick2d opengl-3

我正在尝试创建一个类来加速在我的程序中生成纹理多边形,但纹理未显示。

我将 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);
}

我不知道是什么导致了这个问题。

这是当前显示的内容: Current Result

当我在此行中将“大小”参数更改为 1 和 4 之间时,此处的颜色会发生变化:

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

最佳答案

我没有检查你所有的代码,但你的着色器坏了。您没有声明正确的 in 变量,所以您基本上使用未初始化的数据。这些着色器是否甚至使用全局变量的 layout 限定符进行编译?

顶点着色器应更改为:

layout(location=0) <b>in</b> vec3 pos;
layout(location=1) <b>in</b> vec2 tex;

和片段着色器类似:

<b>in</b> vec2 Tex;

请注意,位置仅与某些主机 <-> GL 通信(如制服、顶点属性和片段着色器输出)的情况​​相关,但没有用于 GL 管道内部的着色器输入和输出的位置,因此您不能声明片段着色器输入的位置。这些变量与名称相匹配。

关于java - OpenGL 3.2 纹理不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20747035/

相关文章:

java - 通过 reSTLet API 调用 RESTful WS

java - java system.in可以在不使用线程的情况下同时与输入源代码一起工作吗

java - 策略游戏 map 加载算法中的性能相关问题(Java,lwjgl)

java - OpenGL 与 glTexCoord - 具有许多图 block 的图像可能会变得乏味?

java - 在 OpenGL 中,如何使我的天空盒不覆盖我的任何实体?

java - 在 Java 中编写注释来约束类/方法命名?

java - 从 Web 服务获取的 WSDL 与用于生成 Web 服务的 WSDL 不同

c++ - 片段着色器中的 GLSL 翻译未按预期工作

opengl - glBindBuffer 中的 GL_ARRAY_BUFFER 目标意味着什么?

c++ - 恒定缓冲区 DirectX 11