我已经按照这两个教程:Durian Software和LWJGL 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数组。
答案 0 :(得分:0)
在你的顶点着色器中使用
in vec2 position;
干杯, 马西莫
答案 1 :(得分:-1)
来自Reto Koradi: 您将需要顶点着色器中的顶点属性。你正在使用制服。它看起来应该是一个偏移量,但你仍然需要一个接收每个顶点坐标的属性。