OpenGL:Square 不绘制到 window(无错误)
OpenGL: Square does not draw to window (No errors)
我已经学习了这两个教程:Durian Software and LWJGL Tutorial Series 试图在尝试构建一个基本项目之前更好地理解 OpenGL 和 LWJGL,并且我认为我理解了代码。但是,当我编写以下代码时,我试图绘制到 window 的正方形没有出现。我真的不确定为什么下面的代码没有绘制正方形。
程序本身:
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 等函数肯定有效,因为它们与我在教程中使用的相同,游戏 class 和 ShaderProgram class 也是如此。此外,Player(它扩展了 Entity)正确地初始化了顶点和 elementOrder 数组。
在你的顶点着色器中使用
in vec2 position;
干杯,
马西莫
来自 Reto Koradi:
您将需要顶点着色器中的顶点属性。你用的是制服。看起来应该是一个偏移量,但您仍然需要一个属性来接收每个顶点的坐标。
我已经学习了这两个教程:Durian Software and LWJGL Tutorial Series 试图在尝试构建一个基本项目之前更好地理解 OpenGL 和 LWJGL,并且我认为我理解了代码。但是,当我编写以下代码时,我试图绘制到 window 的正方形没有出现。我真的不确定为什么下面的代码没有绘制正方形。
程序本身:
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 等函数肯定有效,因为它们与我在教程中使用的相同,游戏 class 和 ShaderProgram class 也是如此。此外,Player(它扩展了 Entity)正确地初始化了顶点和 elementOrder 数组。
在你的顶点着色器中使用
in vec2 position;
干杯, 马西莫
来自 Reto Koradi: 您将需要顶点着色器中的顶点属性。你用的是制服。看起来应该是一个偏移量,但您仍然需要一个属性来接收每个顶点的坐标。