java - LWJGL代码产生黑屏

标签 java opengl glsl lwjgl

我一直在试图弄清楚如何移植 these tutorials 的第 2 章.

该代码仅产生黑屏,我不明白为什么。没有产生任何错误。

package modern.opengl;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.GL_BGR;
import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import org.lwjgl.util.Timer;

public class Lesson01 {

    public static final Logger logger = Logger.getLogger(Lesson01.class.getName());

    static {
        try {
            logger.addHandler(new FileHandler("errors.log", true));
        } catch (IOException ex) {
            logger.log(Level.WARNING, ex.toString(), ex);
        }
    }
    private int displayWidth;
    private int displayHeight;
    private String displayTitle;
    private int vertexBuffer;
    private int elementBuffer;
    private int texture0;
    private int texture1;
    private int program;
    private int uniformFadeFactor;
    private int uniformTexture0;
    private int uniformTexture1;
    private int attributePosition;
    private float fadeFactor;
    private Timer timer;

    public static void main(String[] args) {
        Lesson01 lesson01 = null;
        try {
            lesson01 = new Lesson01();
            lesson01.setup();
            lesson01.run();
        } catch (Exception ex) {
            logger.log(Level.SEVERE, ex.toString(), ex);
        } finally {
            if (lesson01 != null) {
                lesson01.teardown();
            }
        }
    }

    public Lesson01() {
        timer = new Timer();
        timer.resume();
        displayWidth = 400;
        displayHeight = 300;
        displayTitle = "Lesson 01";
    }

    public void makeResources() throws Exception {
        float[] vertexBufferDataArray = {-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f};
        FloatBuffer vertexBufferData = ByteBuffer.allocateDirect(vertexBufferDataArray.length * 4).asFloatBuffer();
        vertexBufferData.put(vertexBufferDataArray);
        vertexBufferData.rewind();
        vertexBuffer = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glBufferData(GL_ARRAY_BUFFER, vertexBufferData, GL_STATIC_DRAW);

        short[] elementBufferDataArray = {0, 1, 2, 3};
        ShortBuffer elementBufferData = ByteBuffer.allocateDirect(elementBufferDataArray.length * 2).asShortBuffer();
        elementBufferData.put(elementBufferDataArray);
        elementBufferData.rewind();
        elementBuffer = glGenBuffers();
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementBufferData, GL_STATIC_DRAW);

        texture0 = makeTexture("hello1.png");
        texture1 = makeTexture("hello2.png");
        if (texture0 == 0 || texture1 == 0) {
            throw new Exception("Failed to allocate textures!");
        }

        String vertexShaderSource =
                "#version 110                                     \n"
                + "attribute vec2 position;                       \n"
                + "varying vec2 texcoord;                         \n"
                + "void main()                                    \n"
                + "{                                              \n"
                + "gl_Position = vec4(position, 0.0, 1.0);        \n"
                + "texcoord = position * vec2(0.5) + vec2(0.5);   \n"
                + "}                                              \n";
        int vertexShader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShader, vertexShaderSource);
        glCompileShader(vertexShader);
        if (glGetShader(vertexShader, GL_COMPILE_STATUS) == 0) {
            logger.log(Level.SEVERE, glGetShaderInfoLog(vertexShader, 10240));
            throw new Exception("Failed to compile vertex shader!");
        }

        String fragmentShaderSource =
                "#version 110                                 \n"
                + "uniform float fade_factor;                 \n"
                + "uniform sampler2D textures[2];             \n"
                + "varying vec2 texcoord;                     \n"
                + "void main()                                \n"
                + "{                                          \n"
                + "    gl_FragColor = mix(                    \n"
                + "        texture2D(textures[0], texcoord),  \n"
                + "        texture2D(textures[1], texcoord),  \n"
                + "        fade_factor                        \n"
                + "    );                                     \n"
                + "}                                          \n";
        int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragmentShader, fragmentShaderSource);
        glCompileShader(fragmentShader);
        if (glGetShader(fragmentShader, GL_COMPILE_STATUS) == 0) {
            logger.log(Level.SEVERE, glGetShaderInfoLog(fragmentShader, 10240));
            throw new Exception("Failed to compule vertex shader!");
        }

        program = glCreateProgram();
        glAttachShader(program, vertexShader);
        glAttachShader(program, fragmentShader);
        glLinkProgram(program);
        if (glGetProgram(program, GL_LINK_STATUS) == 0) {
            logger.log(Level.SEVERE, glGetProgramInfoLog(program, 10240));
            throw new Exception("Failed to link shader program.");
        }

        uniformFadeFactor = glGetUniformLocation(program, "fade_factor");
        uniformTexture0 = glGetUniformLocation(program, "textures[0]");
        uniformTexture1 = glGetUniformLocation(program, "textures[1]");
        attributePosition = glGetAttribLocation(program, "position");
    }

    public void setup() throws LWJGLException, Exception {
        Display.setDisplayMode(new DisplayMode(displayWidth, displayHeight));
        Display.setFullscreen(false);
        Display.setTitle(displayTitle);
        Display.create();
        Keyboard.create();
        Mouse.create();
        makeResources();
    }

    public void teardown() {
        Mouse.destroy();
        Keyboard.destroy();
        Display.destroy();
    }

    public void run() {
        while (!Display.isCloseRequested()) {
            Timer.tick();
            if (Display.isVisible()) {
                fadeFactor = (float) (Math.sin(timer.getTime()) * 0.5 + 0.5);
                render();
            } else {
                if (Display.isDirty()) {
                    render();
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    // Pass
                }
            }
            Display.update();
            Display.sync(60);
        }
    }

    public void render() {
        glUseProgram(program);
        glUniform1f(uniformFadeFactor, fadeFactor);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texture0);
        glUniform1i(uniformTexture0, 0);

        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, texture1);
        glUniform1i(uniformTexture1, 1);

        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glVertexAttribPointer(attributePosition, 2, GL_FLOAT, false, 8, 0);
        glEnableVertexAttribArray(attributePosition);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
        glDrawElements(GL_TRIANGLE_STRIP, 4, GL_SHORT, 0);
        glDisableVertexAttribArray(attributePosition);
    }

    public static int makeTexture(String filename) throws IOException {
        BufferedImage bufferedImage = ImageIO.read(new File(filename));
        byte[] textureBufferArray = ((DataBufferByte) (bufferedImage.getRaster().getDataBuffer())).getData();
        ByteBuffer textureBuffer = ByteBuffer.allocateDirect(textureBufferArray.length);
        textureBuffer.put(textureBufferArray);
        textureBuffer.rewind();
        int textureId = glGenTextures();
        glBindTexture(GL_TEXTURE_2D, textureId);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexImage2D(
            GL_TEXTURE_2D, 
            0, 
            GL_RGB8, 
            bufferedImage.getWidth(), 
            bufferedImage.getHeight(), 
            0, 
            GL_BGR, 
            GL_UNSIGNED_BYTE, 
            textureBuffer
        );
        return textureId;
    }
}

最佳答案

我猜你已经找到了。 添加选项 -Dorg.lwjgl.util.Debug=true 我尝试了同样的事情,我认为错误在于该行 glDrawElements(GL_TRIANGLE_STRIP, 4, GL_SHORT, 0); 从规范http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml ,类型不能为 GL_SHORT。

关于java - LWJGL代码产生黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9089020/

相关文章:

java - 如何根据用户输入在paint方法中绘制墙

java - 连接到 MS Access 的 Eclipse 的深不可测的编码行为

包含 header 时的 C++ OpenGL LNK2001

c++ - 二维角色的 move 仅在一个方向上有效

GLSL:找不到我的自定义函数

java - JAVA中访问另一个类变量

java - 使用 new 运算符包装基元与使用 valueOf 包装基元

bash - Golang OpenGL 错误 PlatformError : X11: The DISPLAY environment variable is missing panic: NotInitialized: The GLFW library is not initialized

opengl - dFdxFine 和 dFdxCoarse 的区别

javascript - 顶点着色器中未声明名称相同但类型不同的变量,或片段着色器中静态使用的变量 : fogDepth