当前位置: 首页 > 知识库问答 >
问题:

在 LWJGL OpenGL 中未使用 VBO 和 VBA 绘制三角形

樊俊悟
2023-03-14

我是最新版本的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);
}

代码运行,但都是黑色的。有什么想法吗?

共有2个答案

慕高格
2023-03-14

您已经在检查着色器编译日志,所以着色器应该没问题。开始调试这些的一个好方法是开始在很多地方插入glGetError()调用。如果您得到一个非零的返回值(0==GL_NO_ERROR),您就会知道早期的gl*调用有问题。例如,目前您正在调用glValidateProgram,如果程序未成功链接,它将生成错误,但您必须自己使用glGetError()检查错误。

编辑:由于您使用的是LWJGL,因此还可以使用lwjgl.opengl.Util中的错误检查方法。

丌官和泰
2023-03-14

我发现了问题:

    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的生成与绑定 以及渲染循环中的绘制调用: 我重复一遍,用我做过的相同顶点绘制多个对象。我需