Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
四元体部分的OpenGL 3D纹理和贴图_Opengl_Texture Mapping - Fatal编程技术网

四元体部分的OpenGL 3D纹理和贴图

四元体部分的OpenGL 3D纹理和贴图,opengl,texture-mapping,Opengl,Texture Mapping,我正在做一个类似于地形引擎的东西来学习一些OpenGL和3D,除了我不满意的FPS,其他一切都很好 当前:我目前只绘制可见面,并使用截锥剔除,立方体是16×16×32个立方体块(目前) 我每个区块使用6个显示列表,每边一个(左、右、前、后、上、下),因此立方体不是一个接一个地绘制,而是同时绘制整个区块边 用这种方法,我得到了大约20-100fps,这不是很好。分析说,我向图形卡发送了大约100k个顶点,当我看到天空,顶点低于10k时,我会达到200+fps,所以我想这是我的瓶颈 我想做什么:因

我正在做一个类似于地形引擎的东西来学习一些OpenGL和3D,除了我不满意的FPS,其他一切都很好

当前:我目前只绘制可见面,并使用截锥剔除,立方体是16×16×32个立方体块(目前)

我每个区块使用6个显示列表,每边一个(左、右、前、后、上、下),因此立方体不是一个接一个地绘制,而是同时绘制整个区块边

用这种方法,我得到了大约20-100fps,这不是很好。分析说,我向图形卡发送了大约100k个顶点,当我看到天空,顶点低于10k时,我会达到200+fps,所以我想这是我的瓶颈

我想做什么:因为越少越好,我继续前进,发现:

据我所知,Kojack使用巨大平面的3D网格,并以某种方式将2D纹理图集中的纹理绘制到这些巨大平面的特定位置。他说他使用256x256x256 3D纹理和绿色和蓝色通道映射到2D纹理图谱

他的方法为平面加上固定数量的顶点,如果应用了我的贴图,有时是无用的顶点,但仍然比我现在拥有的要少

我的问题:我什么都不懂他说的:(,我想试试他的方法,但我不明白他到底做了什么,我认为主要是我缺乏3D纹理的经验(我正在想象一块像素).他是如何将纹理从纹理图集映射到一个平面的一部分的,这是通过使用一些3D纹理贴图


有人能解释一下Kojack做了什么,或者给我指出一些有用的地方吗,即使谷歌现在也帮不上什么忙。

以下是你问题的答案。首先,他将场景视为一个256 x 256 x 256立方体。对于每个轴,他渲染256个正方形(每个正方形由两个三角形组成),每个轴的值都是立方体的完整大小(即从0,0,0到0256256,然后从1,0,0到1256256,依此类推到256,0,0到25625656)。然后,他朝着另一个方向做同样的事情——法线相反——得到每个轴总共512个正方形/1024个三角形。对y和z重复该过程,得到总共3072个三角形和3072个顶点(顶点仅沿256 x 256 x 256立方体的边出现)

现在是纹理。实际上,他正在绘制每个立方体,但通过使纹理在该位置透明,使一些立方体不可见。他有两个纹理,一个256 x 256 x 256 3D纹理和一个由较小纹理组成的16 x 16纹理。要绘制纹理,首先他使用正在绘制的立方体的坐标作为3D文本中的纹理坐标因此,如果他在位置42、7、13绘制立方体,那么3D纹理坐标是42、7、13。在3D纹理中,他存储的所有值都是绿色和蓝色,对应于要绘制的纹理图集中子纹理的u、v坐标。因此在他的示例中,3D纹理中的颜色是R=0(未使用)、g=2、B=4、A=0(未使用)。他使用2和4作为u、v坐标,然后在纹理图集的位置2、4绘制纹理。由于纹理图集基本上只是一个巨大的纹理,对应于16 x 16(256)个较小的纹理,因此仅绘制一个较小的纹理(在这种情况下,2和4将通过除以16转换为纹理坐标,因此它们变为2/16=0.125和4/16=0.25。这些坐标对应于地图集中位置2,4处的子纹理的0,0,该子纹理的1,1位于0.125+1/16和0.25+1/16。这些坐标用于对立方体进行纹理处理


如果他想挖出一个立方体,他所需要做的就是更改存储在该点的3D纹理中的值,以指向图集中的透明子纹理,因此如果纹理图集中的0,0是完全透明的子纹理,他可以将3D图集中该位置的纹理设置为R=0(未使用)、G=0、B=0、a=0(未使用).

试着将你的面部纹理放在一个固定的位置。每个面部的纹理绑定太多了。

我不知道什么是着色器,所以我想我没有使用它们,但我广泛使用glVertex3f,所以我想是固定的功能。硬件:ATI Radeon X1600的P4 3GHz。Minecraft至少运行200FPS。是的,如果你不使用着色器,Kojack的方法不会是ap可折叠。对于2个三角形,我得到大约650fps=1.5ms/帧。我还测试了8个(每个三角形的所有顶点都在屏幕上),相同的数字,所以对于少量三角形(带纹理),大约1.5ms.从你的屏幕截图来看,我想你是在每个立方体边显示列表上做一个纹理绑定?~6个?谢谢,但这是非常理论化的。我没有得到的是3D纹理:所以他将3D纹理的一部分映射到3072个正方形上,从3D传递到2D,然后对特定的纹理使用某种着色器(我还要多读一些).他怎么能只修改纹理的一部分?我找不到任何功能可以做到这一点-或者它是特定于我不熟悉的3D纹理的?3D纹理只用于查找。他将子立方体的位置视为3D纹理中的纹理坐标,这给了他一个颜色RGBA,他只使用GB值作为l查看2D纹理图集。谢谢,这是瓶颈。现在我一直以大约100 FPS的速度运行。不是很好,我仍然想尝试Kojack的方法,但更好。