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

LWJGL - 在一个系统上进行 VBO 渲染,但不在另一个系统上渲染

东门子昂
2023-03-14

最近,我决定重温一些LWJGL渲染代码,这些代码是我根据LWJGLWiki上的教程使用索引VBOs编写的。在我的台式电脑上,一切正常,但当我切换到学校笔记本电脑时,它拒绝渲染任何内容。

我有以下渲染代码:

GL20.glUseProgram(pId);System.out.println(“NO Error? ” (GL11.glGetError() == GL11.GL_NO_ERROR));

    // Bind to the VAO that has all the information about the vertices and colors
    GL30.glBindVertexArray(vaoId);
    GL20.glEnableVertexAttribArray(0);
    GL20.glEnableVertexAttribArray(1);
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));

    // Bind to the index VBO that has all the information about the order of the vertices
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiId);

    // Draw the vertices
    GL11.glDrawElements(GL11.GL_TRIANGLES, indicesCount, GL11.GL_UNSIGNED_INT, 0);

    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));
    // Put everything back to default (deselect)
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL20.glDisableVertexAttribArray(0);
    GL20.glDisableVertexAttribArray(1);
    GL30.glBindVertexArray(0);
    GL20.glUseProgram(0);
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));

这是我的顶点/碎片着色器

#version 130
uniform mat4 MVP;
in vec4 in_Position;
in vec4 in_Color;
out vec4 pass_Color;
void main(void) {
gl_Position = MVP * in_Position;
pass_Color = in_Color;
}
#version 130
in vec4 pass_Color;
out vec4 out_Color;
void main(void) {
out_Color = pass_Color;
}

这是我的VBO初始化函数

public void initialize(float[] vertices, float[] colors, int[] indices) {
    shaderSetup();
    //create the buffers to hold vertex color and index data
    FloatBuffer verticesBuffer = BufferUtils.createFloatBuffer(vertices.length);
    verticesBuffer.put(vertices);
    verticesBuffer.flip();
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));

    FloatBuffer colorsBuffer = BufferUtils.createFloatBuffer(colors.length);
    colorsBuffer.put(colors);
    colorsBuffer.flip();
    // OpenGL expects vertices in counter clockwise order by default
    indicesCount = indices.length;
    IntBuffer indicesBuffer = BufferUtils.createIntBuffer(indicesCount);
    indicesBuffer.put(indices);
    indicesBuffer.flip();
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));

    // Create a new Vertex Array Object in memory and select it (bind)
    vaoId = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(vaoId);
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));

    // Create a new Vertex Buffer Object in memory and select it (bind) - VERTICES
    vboId = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesBuffer, GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(0, 4, GL11.GL_FLOAT, false, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));

    // Create a new Vertex Buffer Object in memory and select it (bind) - COLORS
    vbocId = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbocId);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorsBuffer, GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));

    // Deselect (bind to 0) the VAO
    GL30.glBindVertexArray(0);
    // Create a new VBO for the indices and select it (bind) - INDICES
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));
    vboiId = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiId);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL15.GL_STATIC_DRAW);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    System.out.println("NO Error? " + (GL11.glGetError() == GL11.GL_NO_ERROR));
}

着色器设置代码:

int errorCheckValue = GL11.glGetError();
// Load the vertex shader
vsId = this.loadShader("Shaders/vertex.glsl", GL20.GL_VERTEX_SHADER);
// Load the fragment shader
fsId = this.loadShader("Shaders/fragment.glsl", GL20.GL_FRAGMENT_SHADER);
// Create a new shader program that links both shaders
pId = GL20.glCreateProgram();
GL20.glAttachShader(pId, vsId);
GL20.glAttachShader(pId, fsId);
GL20.glLinkProgram(pId);
// Position information will be attribute 0
GL20.glBindAttribLocation(pId, 0, "in_Position");
// Color information will be attribute 1
GL20.glBindAttribLocation(pId, 1, "in_Color");
GL20.glValidateProgram(pId);
errorCheckValue = GL11.glGetError();
if (errorCheckValue != GL11.GL_NO_ERROR) {
System.out.println("ERROR - Could not create the shaders");
    System.exit(-1);
}

我家里的台式机(可以像预期的那样渲染一切)运行的是英伟达GTX 460显卡,我学校的笔记本电脑(不能渲染任何东西)运行的是AMD Firepro m4000显卡。我的最佳猜测是VBO渲染/创建/着色器代码的某些部分与我的m4000卡不兼容,但我无法找到任何与glGetError()有关的错误。

共有1个答案

钱焕
2023-03-14

着色器设置代码中的调用顺序将无法按预期工作:

GL20.glLinkProgram(pId);
GL20.glBindAttribLocation(pId, 0, "in_Position");
GL20.glBindAttribLocation(pId, 1, "in_Color");

glBindAttribLocation() 需要在 glLinkProgram() 生效之前调用。从手册页:

在调用glLinkProgram之前,属性绑定不会生效。成功链接程序对象后,通用属性的索引值保持固定(可以查询其值),直到下一个链接命令出现。

因此,呼叫的顺序需要为:

GL20.glBindAttribLocation(pId, 0, "in_Position");
GL20.glBindAttribLocation(pId, 1, "in_Color");
GL20.glLinkProgram(pId);

虽然不是正确性问题,但您也没有非常有效地使用VAO。属性启用/禁用值和GL_ELEMENT_ARRAY_BUFFER绑定是 VAO 状态的一部分。因此,您可以在设置期间调用glEnableVertexAttribArray()GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER,vboiId)一次,同时绑定VAO。然后在 draw 调用中,只需绑定 VAO 即可设置所有状态。

 类似资料:
  • 注意:很抱歉链接/图片只不过是文本-作为一个新用户,我不能张贴图片,也不能张贴 所以我一直在使用被弃用的OpenGL,并在几周前决定最终转向更现代的方法。我使用Open.gl作为资源(我发现LWJGL教程是不一致和稀疏的),并且能够渲染到本教程的最后一幅图像。然而,我在下一页遇到了一些严重的问题(渲染一个立方体)。 我在这个问题上做了很多研究,并多次改进/重新组织我的代码,以便完全理解每个组件的用

  • 我在自己的本地系统上成功地创建了一个spring启动项目。我想构建一个jar文件,以便在远程服务器上安装它。所以我必须配置远程服务器的服务器地址和mySql地址,但我无法构建,并且有很多错误,它们都是正确的,因为我的系统无法看到远程服务器地址和数据库。 这是我的。属性文件: 如何处理它在其他配置上运行?(另一个IP,数据源和...)我做的对不对?谢啦

  • 我试图弄清楚为什么我不能用LWJGL 3渲染任何纹理。我尝试了多种加载(PNGDecoder、STB、BufferedImage)和渲染纹理的方法。但结果总是一个白色的四边形。 主要类: 加载方法: 渲染方法: ModelTexture类只是存储一些现在不使用的信息,blue.png是16x16的png文件。 这是我在启动程序时得到的输出:

  • 我试图在屏幕上画一堆点。我使用CUDA生成数据(位置和颜色),并用OpenGL绘制它。我试图让CUDA更新一个VBO,然后用OpenGL来绘制它,但是我得到了一个空白的屏幕。我不确定CUDA是否无法更新缓冲区,或者缓冲区绘制不正确。我的GPU是GTX 1080,我正在尝试使用OpenGL 4.0。颜色也由CUDA指定。如果我的问题是我需要一个着色器,我如何添加它,但仍然通过CUDA指定颜色? 更新

  • 我目前正在从事一个项目,该项目涉及将LWJGL游戏场景渲染为视频流而不是窗口。我相信,如果将游戏场景渲染为中间格式(如 ByteBuffer),我就能实现这一目标。我正在尝试扩展LWJGL 演示作为概念证明。 我发现了一个类似的SO问题和一个论坛帖子,但我无法做到这一点。我是OpenGL和LWJGL的初学者,我正在努力寻找关于这方面的可理解文档。 在渲染循环()的开始,调用函数。根据我的理解,它将

  • 在过去的几天里,我一直在尝试将纹理缩放为Quad(OpenGL 3)... 但由于某些原因,我只得到渲染到四元网格上的图像左上角像素,我使用平滑的UTIL加载和绑定纹理。。。。 代码如下: 主要游戏。Java语言 着色器程序。Java语言 顶点着色器: 片段着色器: 装载机。Java语言 模型Java语言 vbo. java 这是我想要渲染的图像(它是测试图像)(PNG格式)一头奶牛: 这是我得到