- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 opengl 中以即时模式渲染世界后,我开始学习 VBO。一切都运行良好,除了分散在世界各地的这些随机顶点,我确信我没有指定。然而,当我将 UV 坐标从 1 更改为 0.5 时,创建的形状会变小。我已经检查了我的 UV 坐标好几次了,但我似乎找不到任何问题。就像我说的,我在使用 VBO 方面有点菜鸟,所以任何帮助我将这些形状从我的世界中剔除的人将不胜感激。这是我的源代码(纹理的 ss=S 坐标开始和 se = S 坐标结束):
public class MyProject {
int width=1,depth=1,height=1,w=854,h=480;
float size= .50f;
Camera cam = new Camera();
Block[][][] blocks = new Block[height][width][depth];
int textureId,vboHandle,vtoHandle;
FloatBuffer vbo,vto;
public static void main(String[] args){
MyProject mp = new MyProject();
mp.start();
}
public void start(){
initDisplay();
initGL();
initWorld();
run();
}
public void initWorld(){
for(int x = 0; x<blocks[0].length;x++){
for(int y = 0; y<blocks.length;y++){
for(int z = 0; z<blocks[0][0].length;z++){
blocks[y][x][z] = new Block(x,y,z);
blocks[y][x][z].rendertype=GL11.GL_QUADS;
}
}
}
}
public void initDisplay(){
try {
boolean set=false;
DisplayMode[] displays = Display.getAvailableDisplayModes();
for(int i=0;i<displays.length;i++){
DisplayMode d = displays[i];
if(d.getWidth()==w&&d.getHeight()==h){
Display.setDisplayMode(d);
set=true;
break;
}
}
if(!set)Display.setDisplayMode(new DisplayMode(w,h));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
}
public void initGL(){
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GL11.glClearDepth(1.0);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, (float)w/(float)h, .001f, 100f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
textureId = Texture.loadTexture(Texture.loadImage("/imgs/texture.png"));
vboHandle = GL15.glGenBuffers();
vtoHandle = GL15.glGenBuffers();
}
public void run(){
while(!Display.isCloseRequested()){
Input.tick();
cam.tick();
render();
Display.update();
Display.sync(60);
}
Display.destroy();
GL15.glDeleteBuffers(vboHandle);
GL15.glDeleteBuffers(vtoHandle);
GL11.glDeleteTextures(textureId);
}
public Block getBlock(int x, int y, int z){
if(x<0||x>=width-1||y<0||y>=height-1||z<0||z>=depth-1){
return null;
}
else return blocks[y][x][z];
}
public boolean checkSurroundings(int x, int y, int z){
if(getBlock(x,y-1,z)!=null&&getBlock(x,y+1,z)!=null&&
getBlock(x,y,z-1)!=null&&getBlock(x,y,z+1)!=null&&
getBlock(x-1,y,z)!=null&&getBlock(x+1,y,z)!=null){
return true;
}
return false;
}
public void render(){
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glLoadIdentity();
GL11.glRotatef(cam.pitchrot, 1, 0, 0);
GL11.glRotatef(cam.yawrot, 0, 1, 0);
GL11.glRotatef(cam.rollrot, 0, 0, 1);
GL11.glTranslatef(cam.x, cam.y, cam.z);
GL11.glColor3f(1.0f, 1.0f, 1.0f);
vbo = BufferUtils.createFloatBuffer(width*height*depth*24*3);
vto = BufferUtils.createFloatBuffer(width*height*depth*24*2);
for(int x = 0; x<blocks[0].length;x++){
for(int y = 0; y<blocks.length;y++){
for(int z = 0; z<blocks[0][0].length;z++){
Block b = blocks[y][x][z];
if(b!=null)
renderCubeVBO(b);
}
}
}
vbo.flip();
vto.flip();
glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
glBufferData(GL_ARRAY_BUFFER, vbo, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0L);
glBindBuffer(GL_ARRAY_BUFFER, vtoHandle);
glBufferData(GL_ARRAY_BUFFER, vto, GL_STATIC_DRAW);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, width*height*depth*24*3);
}
public void renderCubeVBO(Block b){
vbo.put(new float[]{
//top
b.x+size, b.y+size, b.z-size,
b.x-size, b.y+size, b.z-size,
b.x-size, b.y+size, b.z+size,
b.x+size, b.y+size, b.z+size,
//bottom
b.x+size,b.y-size, b.z+size,
b.x-size,b.y-size, b.z+size,
b.x-size,b.y-size, b.z-size,
b.x+size,b.y-size, b.z-size,
//front
b.x+size, b.y+size, b.z+size,
b.x-size, b.y+size, b.z+size,
b.x-size, b.y-size, b.z+size,
b.x+size, b.y-size, b.z+size,
//back
b.x-size, b.y +size, b.z-size,
b.x+size, b.y +size, b.z-size,
b.x+size, b.y-size, b.z-size,
b.x-size, b.y-size, b.z-size,
//left
b.x-size, b.y+size, b.z+size,
b.x-size, b.y+size, b.z-size,
b.x-size,b.y-size, b.z-size,
b.x-size,b.y-size, b.z+size,
//right
b.x+size, b.y+size, b.z-size,
b.x+size, b.y+size, b.z +size,
b.x+size, b.y-size, b.z+size,
b.x+size, b.y-size, b.z-size,
});
vto.put(new float[]{
//top
b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
//bottom
b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
//front
b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
//back
b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
//left
b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
//right
b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
});
}
}
以下是我所讨论内容的一些屏幕截图: /image/yFtdY.jpg
最佳答案
glDrawArrays 获取要渲染的顶点数,而不是附加缓冲区的大小。您在那里得到了一些神奇的数字 (24 * 3
),因此您很可能混淆了这些数字。
关于java - 我没有告诉它 VBO 渲染顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18337791/
目前,在我的渲染引擎中,每个网格数据都有一个 VBO(1 个 VBO 用于顶点,1 个 VBO 用于法线,1 个 VBO 用于纹理坐标,1 个 VBO 用于切线,1 个 VBO 用于副切线)并且它们都
我有一个代码,最初有一个着色器 (ourShader)、一个 VAO 和一个 VBO。它将使用 Stencil 测试渲染带有纹理立方体的场景及其在地面上的反射。现在,我想为后处理添加一个帧缓冲区,所以
因此,我使用两个 VBO 成功绘制了一系列线条,一个用于顶点,一个用于索引。 Python 列表是: vertices = [ [0,1],[0,2],[0,3], # Axe
因此,我需要使用一次绘制调用来渲染多个对象(而非实例)的方法。实际上我知道如何做到这一点,只是将数据放入单个 vbo/ibo 并使用 glDrawElements 进行渲染。 问题是:使用 glUni
大家好。我正在尝试呈现如下所示的两种方法。 RenderA() 使用的是 VBO 而 RenderB() 不是。当它到达 RenderB() 中的 glDrawArrays() 时,我收到一个 EXC
我正在尝试制作一个类似于《我的世界》的 opengl 体素引擎。 我创建了一个 block 类,我想将整个 block 的所有顶点放入单个 VBO 中。我之前只是将每个 block 放入 vbo 中并
我最近将当前项目中的绘图从内存阵列的标准绘图更改为 VBO。令我惊讶的是,帧速率从 60fps 显着下降到 30fps,绘制了 1200verts 的模型 8 次。进一步的分析表明,与从内存中绘制相比
所以我了解如何使用顶点缓冲区对象,并且它比立即模式绘图提供了很大的性能提升。我将绘制很多 2D 四边形( Sprite ),我想知道我是否应该为每个四边形创建一个 VBO,或者创建一个 VBO 来保存
我正在编写一个在 OpenGL 中渲染一些网格的插件。 我在一个 VBO 中有一个 Vertices 数组,在另一个 VBO 中有一个 Indices 数组。我现在想存储法线。由于多个面之间共享的顶点
你能渲染一个由四边形组成的 VBO,每个四边形都具有不同的纹理吗?现在,我读到了有关按纹理或纹理图集排序的内容,但这仍然不能回答我的问题。我正在开发一款 2d 游戏。现在我的动画 Sprite 将拥有
我有一个 2D VBO 对象,它表示 2D 空间中的点。此时绘制任意形状的最佳方法是什么?假设我想在每个位置画一个红色的“X”。 我可以使用着色器来做到这一点吗? 最佳答案 您不一定需要特殊的着色器,
如果我有一个顶点不断变化的模型,因此我需要在每一帧上重新绑定(bind) VBO 上的所有信息,使用即时模式是否会提高性能?或者,所有数据同时传递到 GFX 卡的事实仍然是 VBO 的救赎因素吗? 根
我想在交错的 OpenGL vbo 中存储三个浮点值和两个字节值。不幸的是,渲染的数据显然不正确。当我使用两个不同的 VBO 渲染相同的数据时,一切都工作正常,因此我不认为我的着色器存在问题。 /*
此代码工作正常,呈现正确(没有发布所有相关代码,因为我认为这些部分有问题): std::vector vboId; std::vector > verts; ...初始化: verts[num].pu
现在我正在使用索引,所以我在让我的 VBO 正确渲染法线时遇到了一些麻烦。我很确定我对普通指针的偏移有问题,但数学似乎加起来对我来说是正确的。 我如何存储数据: struct MyVertex {
我正在尝试使用 OpenGL 中的顶点缓冲区对象绘制两个四边形。他们应该用不同的颜色绘制。如您所见,第一个四边形具有红色、绿色、蓝色和黄色顶点。第二个四边形有不同的颜色,但问题是第二个四边形被完全绘制
我正在尝试在我的原生黑莓 10 应用程序中使用 VBO 绘制一个正方形。我的实现是, glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
在我的项目中,我想使用 vbo 显示许多对象(球体)。我设法毫无问题地显示 1 个对象,但是当涉及到 2 个或更多对象时,所有对象 (vbos) 都被最后定义的对象 (vbo) 替换。 CosmicB
我已经学习 VBO 几个星期了,有人告诉我 here VBO 可以渲染“约 100 万个顶点,每秒数百帧”。然而,我当前的 VBO 测试程序只能获得大约 50 FPS 的渲染速度和 100 万个顶点。
我正在使用 Haskell 制作一个渲染引擎,并且正在优化我的代码以使用 VBO。我想稍微抽象一下几何类型,因为有相当数量,并且想把它放在一个函数和一些参数中。 例如,如果我有一组几何体,它是一对顶点
我是一名优秀的程序员,十分优秀!