我有两个VBO,我试图渲染,它们在屏幕上应该有两个不同的位置。当我试图修改其中一个VBO的位置时,它会被转移到另一个VBOs。
示例-我更改了对象2的y位置,对象1和对象2现在都存在于该y位置。
我用于转换VBO的代码:
Matrix4f.scale(scale, modelMatrix, modelMatrix);
Matrix4f.translate(position, modelMatrix, modelMatrix);
Matrix4f.rotate(Toolkit.degToRad(rotation.x), new Vector3f(1f,0f,0f), modelMatrix, modelMatrix);
Matrix4f.rotate(Toolkit.degToRad(rotation.y), new Vector3f(0f,1f,0f), modelMatrix, modelMatrix);
Matrix4f.rotate(Toolkit.degToRad(rotation.z), new Vector3f(0f,0f,1f), modelMatrix, modelMatrix);
请注意位置,旋转,缩放都是Vector3fs,modelMatrix是well,模型矩阵。
此外,这是一个工具包。degToRad类似于数学。toRadians()类型的方法。
我将信息传递给着色器的代码:
//Apply Transformations
camera.reset();
camera.transform();
glUseProgram(ss.pId);
//Projection Matrix
camera.projectionMatrix.store(camera.matrixBuffer);
camera.matrixBuffer.flip();
projection.Matrix4(camera.matrixBuffer);
//View Matrix
camera.viewMatrix.store(camera.matrixBuffer);
camera.matrixBuffer.flip();
view.Matrix4(camera.matrixBuffer);
glUseProgram(0);
//Apply Transformations
obj.reset();
obj.transform();
glUseProgram(ss.pId);
//Object 1
obj.modelMatrix.store(camera.matrixBuffer);
camera.matrixBuffer.flip();
model.Matrix4(camera.matrixBuffer);
glUseProgram(0);
//Apply Transformations
obj2.reset();
obj2.transform();
glUseProgram(ss.pId);
obj2.modelMatrix.store(camera.matrixBuffer);
camera.matrixBuffer.flip();
model.Matrix4(camera.matrixBuffer);
glUseProgram(0);
obj和obj2是VBOs,model是着色器uniform,camera是摄影机,ss是着色器程序,ss.pId是程序Id。
我绘制VBOs的代码:注意,这是在obj和obj2中找到的,用法如下
obj.draw();
obj2.draw();
这是绘图方法
GL20.glUseProgram(ss.pId);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, t.id);
GL30.glBindVertexArray(g.vaoId);
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
GL20.glEnableVertexAttribArray(2);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, g.vboiId);
GL11.glDrawElements(GL11.GL_TRIANGLES, g.indices, GL11.GL_UNSIGNED_BYTE, 0);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL20.glDisableVertexAttribArray(2);
GL20.glUseProgram(0);
GL20.glUseProgram(ss.pId);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, t.id);
GL30.glBindVertexArray(g.vaoId);
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
GL20.glEnableVertexAttribArray(2);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, g.vboiId);
GL11.glDrawElements(GL11.GL_TRIANGLES, g.indices, GL11.GL_UNSIGNED_BYTE, 0);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL20.glDisableVertexAttribArray(2);
GL20.glUseProgram(0);
g是几何课,
g 包含索引缓冲区 id,顶点缓冲区 id. t 包含纹理和 id。
感谢您的帮助。
矩阵变换适用于一切,而不仅仅是一个单一的VBO。
我的建议是转换,绘制,然后为下一次绘制做反向转换。
您的整个程序结构看起来相当不寻常,我相信这是绊倒您的一部分。例如,虽然我完全支持封装,但在对象中包装单个统一,就像您似乎对您的模型
变量所做的那样,将它推得太远IMHO。统一值实际上是着色器程序的属性,而不是独立对象。
无论如何,在不深入设计方面的情况下,我相信你的主要问题在于这个代码序列(省略部分):
// calculate camera.matrixBuffer for object 1
model.Matrix4(camera.matrixBuffer);
...
// calculate camera.matrixBuffer for object 2
model.Matrix4(camera.matrixBuffer);
这些调用中的第二个将覆盖第一个中写入的值,而不使用第一个。当您稍后渲染对象1和对象2时,它们都将使用第二个值作为统一。
只要您对两个对象使用相同的着色器程序(这是一件好事,除非它们确实需要不同的着色器),您就必须在绘制每个对象之前设置统一的值。
因此,设置制服的调用应该进入draw函数,其结构大致如下:
// calculate camera.matrixBuffer for object 1
model.Matrix4(camera.matrixBuffer);
obj1.draw();
...
// calculate camera.matrixBuffer for object 2
model.Matrix4(camera.matrixBuffer);
obj2.draw();
注意:很抱歉链接/图片只不过是文本-作为一个新用户,我不能张贴图片,也不能张贴 所以我一直在使用被弃用的OpenGL,并在几周前决定最终转向更现代的方法。我使用Open.gl作为资源(我发现LWJGL教程是不一致和稀疏的),并且能够渲染到本教程的最后一幅图像。然而,我在下一页遇到了一些严重的问题(渲染一个立方体)。 我在这个问题上做了很多研究,并多次改进/重新组织我的代码,以便完全理解每个组件的用
下面的LWJGL代码将在屏幕中心呈现一个蓝色正方形。相反,我得到了一个空白的白色屏幕。就像渲染根本不工作,或者我在屏幕外渲染。 我是OpenGL和LWJGL的新手,所以我力不从心。我浏览了所有内容,但似乎找不到任何可能与代码有关的问题。 OpenGLTest.scala VertexArray.scala
每当我运行这个,窗口就会弹出,我看到这个。(当我运行游戏时,我看到了这一点) 如果您简单地创建一个新的Java项目,导入OpenGL、GLFW和LWJGL以及本机,然后复制代码,就可以重新创建它(删除包)
我在使用OpenGL使颜色正常工作时遇到问题。我正确地绘制了形状,它们看起来很好,但当我调用glColor4d(r,g,b,a)时,它并没有正确地使用RGB应该指定的颜色,而是绘制了不同但相似的颜色。例如,大多数绿色绘制为完全黄色或完全绿色,任何灰色绘制为纯白。 在这个随机颜色值的短列表中,所有颜色值都绘制为实心FFFFFF白色,即使它们都不应为白色。 我用来绘制矩形的代码:
在代码的开头,我已经初始化了vbo: 然后我的顶点和颜色数组: 现在我创建并绑定vbo并分配空间: 最后是渲染函数: 这应该画一个三角形,但我什么都看不见。可能glVertexPointer和glColorPointer的参数不正确。我已经阅读了opengl上关于VBO的文档。或者,我遵循了几个教程,比如:https://www.youtube.com/watch?v=KIeExgOcmv0 我的
我正在尝试在OpenGL/LWJGL中制作一个简单的按钮, 我可以正确地渲染我的2D四边形,但是当我实现纹理时,整个四边形只有大约3/4的部分得到了纹理,就像这样:https://dl.dropboxusercontent.com/u/60223805/glerror1.png 如果我删除纹理坐标,我得到这个:https://dl.dropboxusercontent.com/u/60223805