【发布时间】:2014-03-16 05:31:24
【问题描述】:
我是 OpenGL 最新版本的新手,我正在尝试按照本教程学习它:http://open.gl/drawing
然而,我正在使用最新版本的 LWJGL,并尽我所能将其 OpenGL 与本教程一样使用。尽管如此,应该绘制的白色三角形还没有。
这是我的代码:
package experiments;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class Exp1 {
//Shader
private int shaderProgram;
private int vertShader;
private int fragShader;
//Vertex Buffer Object
private int vbo;
//Vertex Array Object
private int vao;
//Triangle
private float vertices[] = {
0.0f, 0.5f, // Vertex 1 (X, Y)
0.5f, -0.5f, // Vertex 2 (X, Y)
-0.5f, -0.5f // Vertex 3 (X, Y)
};
public Exp1() throws IOException {
setUpDisplay();
}
private void createShader() throws IOException
{
this.shaderProgram = glCreateProgram();
this.vertShader = glCreateShader(GL_VERTEX_SHADER);
this.fragShader = glCreateShader(GL_FRAGMENT_SHADER);
//set source and compile
glShaderSource(vertShader, fileToString("src/experiments/shader.vert"));
glCompileShader(vertShader);
if(glGetShaderi(vertShader, GL_COMPILE_STATUS) == GL_FALSE) System.err.print("Vertex Shader wasn't able to be compiled correctly");
glShaderSource(fragShader, fileToString("src/experiments/shader.frag"));
glCompileShader(fragShader);
if(glGetShaderi(fragShader, GL_COMPILE_STATUS) == GL_FALSE) System.err.print("Fragment Shader wasn't able to be compiled correctly");
//attach shaders to shader program
glAttachShader(shaderProgram, vertShader);
glAttachShader(shaderProgram, fragShader);
glLinkProgram(shaderProgram);
glValidateProgram(shaderProgram);
}
private void start() throws IOException
{
this.vao = glGenVertexArrays();
glBindVertexArray(vao);
this.vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
FloatBuffer fBuffer= ByteBuffer.allocateDirect(vertices.length * 4).asFloatBuffer();
fBuffer.put(vertices);
glBufferData(GL_ARRAY_BUFFER, fBuffer, GL_STATIC_DRAW);
createShader();
glUseProgram(shaderProgram);
int posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(posAttrib);
while(!Display.isCloseRequested())
{
render();
Display.update();
Display.sync(60);
}
glDeleteProgram(shaderProgram);
glDeleteShader(vertShader);
glDeleteShader(fragShader);
Display.destroy();
System.exit(0);
}
private void render()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
private String fileToString(String path) throws IOException
{
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new FileReader(path));
String line;
while((line = reader.readLine()) != null)
builder.append(line).append('\n');
reader.close();
return builder.toString();
}
private void setUpDisplay()
{
try
{
Display.setDisplayMode(new DisplayMode(640, 480));
Display.setTitle("Shader Demo");
Display.create();
}
catch (LWJGLException e) {
System.out.println("Display Fail");
e.printStackTrace();
Display.destroy();
System.exit(1);
}
}
public static void main(String[] args) throws IOException {
Exp1 demo = new Exp1();
demo.start();
}
}
我的着色器与教程的相同,但为了便于阅读,我还是把它们贴出来:
.frag
#version 150
out vec4 outColor;
void main()
{
outColor = vec4(1.0, 1.0, 1.0, 1.0);
}
.vert
#version 150
in vec2 position;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
}
代码运行,但一切都是黑色的。有什么想法吗?
【问题讨论】:
标签: opengl glsl shader lwjgl vbo