我是最新版本的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();
}
}
我的着色器与本教程的着色器相同,但无论如何都会为了便于阅读而发布它们:
。蓄意杀伤
#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);
}
代码运行,但都是黑色的。有什么想法吗?
您已经在检查着色器编译日志,所以着色器应该没问题。开始调试这些的一个好方法是开始在很多地方插入glGetError()
调用。如果您得到一个非零的返回值(0==GL_NO_ERROR
),您就会知道早期的gl*
调用有问题。例如,目前您正在调用glValidateProgram
,如果程序未成功链接,它将生成错误,但您必须自己使用glGetError()
检查错误。
编辑:由于您使用的是LWJGL,因此还可以使用lwjgl.opengl.Util中的错误检查方法。
我发现了问题:
FloatBuffer fBuffer= ByteBuffer.allocateDirect(vertices.length * 4).asFloatBuffer();
fBuffer.put(vertices);
glBufferData(GL_ARRAY_BUFFER, fBuffer, GL_STATIC_DRAW);
此代码是错误的。正确的方法是:
//Create vertice buffer
FloatBuffer verticeBuffer= BufferUtils.createFloatBuffer(vertices.length);
verticeBuffer.put(vertices).flip();
//Send vertice buffer to VBO
glBufferData(GL_ARRAY_BUFFER, verticeBuffer, GL_STATIC_DRAW);
以下是完整的代码,以防对任何人有用,我尽量让它可读性更好:)
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.FloatBuffer;
import org.lwjgl.BufferUtils;
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)
};
private int posAttrib;
public Exp1() throws IOException {
setUpDisplay();
}
private void start() throws IOException
{
setUpDraw();
while(!Display.isCloseRequested())
{
render();
Display.update();
Display.sync(60);
}
glDeleteProgram(shaderProgram);
glDeleteShader(vertShader);
glDeleteShader(fragShader);
glDeleteBuffers(vbo);
glDeleteVertexArrays(vao);
Display.destroy();
System.exit(0);
}
private void setUpDraw() throws IOException{
// Create a new VAO in memory and bind it (A VAO can have up to 16 attributes (VBO's) assigned to it by default)
this.vao = glGenVertexArrays();
glBindVertexArray(vao);
//Create a new VBO in memory and bind it (A VBO is a collection of Vectors which in this case resemble the location of each vertex)
this.vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
//Create new shader and use it
createShader();
glUseProgram(shaderProgram);
//Create vertice buffer
FloatBuffer verticeBuffer= BufferUtils.createFloatBuffer(vertices.length);
verticeBuffer.put(vertices).flip();
//Send vertice buffer to VBO
glBufferData(GL_ARRAY_BUFFER, verticeBuffer, GL_STATIC_DRAW);
//Put the VBO in the attributes list at index posAttrib
posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, false, 0, 0);
//Unbind VBO and VAO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
private void createShader() throws IOException
{
//create
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 render()
{
//Clear screen
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//Bind our VAO which already has the quad info and enable attribute list in posAttrib index
glBindVertexArray(vao);
glEnableVertexAttribArray(posAttrib);
//Draw the vertices
glDrawArrays(GL_TRIANGLES, 0, 3);
//Unbind back to defaults
glDisableVertexAttribArray(posAttrib);
glBindVertexArray(0);
}
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();
}
}
问题内容: 我正在学习有关使用OpenGL在Java中创建游戏引擎的教程。 我正在尝试在屏幕上渲染一个三角形。一切运行正常,我可以更改背景颜色,但三角形不会显示。我也尝试过运行作为教程系列的一部分提供的代码,但仍然无法正常工作。 链接至教程:http : //bit.ly/1EUnvz4 链接到视频中使用的代码:http : //bit.ly/1z7XUlE 建立 我试过检查OpenGL版本,但相
我必须在正方形上画一个三角形,带星号,预期输出如下图所示。 指令是这样的:编写一个C程序,从用户那里读取一个数字n,并允许使用“*”字符打印一个带有屋顶的房子。房子应该是一个n×n正方形和屋顶两条45度的对角线形成屋顶(如果n是奇数,屋顶在顶部完美地关闭)。我创建了一个三角形和正方形,但我不能把它们结合起来。三角形
当第一次尝试绘制VAOS时,它崩溃了。我画没有着色器(所以它不会引起问题)。 在一个VAO和纹理坐标中最多有12个面(12*3个顶点)。有多达50万个VAO。 我如何创造一张脸: 错误如下: 我不认为把整个错误贴在这里是明智的。你知道为什么会这样吗?我找不到任何关于VBOS的错误。
本文向大家介绍用CSS绘制一个三角形相关面试题,主要包含被问及用CSS绘制一个三角形时的应答技巧和注意事项,需要的朋友参考一下
我试图用DXUT11画一个简单的三角形,但是我在窗口中看不到三角形。 我努力工作,但仍然找不到问题所在-_- 我检查了D3D函数的每个返回值,它们都返回了S_OK<我可以看到我的窗口显示出来,背景色是我设置为清除窗口的颜色,因此看起来d3d设备是当前创建的,并且后缓冲区被渲染到窗口,但是黄色三角形在哪里 T\u T。。。。。。。。。。。。。。。 我的代码如下:(为了简化问题,我已经删除了所有的检查
我试图在OpenGL中使用多个VAO和VBO渲染多个对象。使用相同的顶点渲染多个对象我已经做过了,但是我想做的是为每个对象使用不同的顶点,例如画一个正方形和一个圆形。对于一个正方形,我只需要6个顶点,但是对于圆,我需要360个顶点。我有阅读或创建着色器的错误。 以下是顶点着色器: 片段着色器: VAO和VBO的生成与绑定 以及渲染循环中的绘制调用: 我重复一遍,用我做过的相同顶点绘制多个对象。我需