OpenGL:Square不绘制到窗口(没有错误)

时间:2015-01-08 04:37:10

标签: java opengl glsl lwjgl

我已经按照这两个教程:Durian SoftwareLWJGL Tutorial Series尝试在尝试构建基本项目之前更好地理解OpenGL和LWJGL,我认为我理解了代码。当我写下面的代码时,我试图绘制到窗口的方块没有显示出来。我真的不确定为什么下面的代码没有绘制正方形。

自编:

import java.util.*;

import org.lwjgl.BufferUtils;
import java.nio.FloatBuffer;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.*;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;

import java.lang.Math;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Engine extends Game{

    public int vertexShader, fragmentShader;
    ShaderProgram shaderProgram;
    public int programID;

    Space playArea;

    public Engine(int dimensionX, int dimensionY){
        super(dimensionX, dimensionY);
    }

    @Override 
    public void init(){

        playArea = new Space(100,100); // space is counted in block units
        playArea.entitiesInSpace.add(new Player("you", 0, 0));

        playArea.entitiesInSpace.get(0).vboID = makeBuffer(GL_ARRAY_BUFFER, playArea.entitiesInSpace.get(0).vertices);
        playArea.entitiesInSpace.get(0).eboID = makeBuffer(GL_ELEMENT_ARRAY_BUFFER, playArea.entitiesInSpace.get(0).elementOrder);

        shaderProgram = new ShaderProgram();
        shaderProgram.attachVertexShader("./res/game.vs");
        shaderProgram.attachFragmentShader("./res/game.fs");
        shaderProgram.link();

        playArea.entitiesInSpace.get(0).uniformsPosition = glGetUniformLocation(shaderProgram.programID, "position");

    }

    @Override
    public void render(float delta){
        glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        shaderProgram.bind();

        glUniform2f(playArea.entitiesInSpace.get(0).uniformsPosition, playArea.entitiesInSpace.get(0).posX, playArea.entitiesInSpace.get(0).posY);
        glBindBuffer(GL_ARRAY_BUFFER, playArea.entitiesInSpace.get(0).vboID);
        glVertexAttribPointer(
            0,
            2,
            GL_FLOAT,
            false,
            0,
            0
        );
        glEnableVertexAttribArray(0);

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, playArea.entitiesInSpace.get(0).eboID);
        glDrawElements(
            GL_TRIANGLE_STRIP,
            4,
            GL_UNSIGNED_INT,
            0
        );

        glDisableVertexAttribArray(0);
    }

    @Override
    public void update(float delta){

    }

    public static void main(String[] args) {
        new Engine(400,300).start();
    }

}

矢量着色器

#version 110

uniform vec2 position;

void main(){
    gl_Position = vec4(position, 1.0, 1.0);
}

片段着色器

#version 110

//varying vec4 fragColor;

void main(){
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

上面的makeBuffer之类的函数肯定有效,因为它们与我在教程中使用的相同,Game类和ShaderProgram类也是如此。此外,Player(扩展实体)正确初始化顶点和elementOrder数组。

2 个答案:

答案 0 :(得分:0)

在你的顶点着色器中使用

in vec2 position;

干杯, 马西莫

答案 1 :(得分:-1)

来自Reto Koradi: 您将需要顶点着色器中的顶点属性。你正在使用制服。它看起来应该是一个偏移量,但你仍然需要一个接收每个顶点坐标的属性。