在这一章,我们并不会接触任何实际的Modding代码。然而,这一章所描述的基本概念却至关重要,在从粒子特效到物品、方块渲染的范畴内,这些在MC中关于渲染的基本方法都在无时无刻的被应用着。总而言之,打好基础是十分重要的,所以请打起精神来哦~
由于个人才疏学浅,教程的说明难免有错漏之处,还请各位及时指出咯~> <
注意:OpenGL的部分略有难度,如果觉得理解困难可以多读几次或者选择性略过。
OpenGL,lwjgl和镶嵌器
MC的整个渲染引擎,基于开源游戏API:
lwjgl的
OpenGL部分而搭建。这也就意味着MC的渲染过程中,会大量的用到OpenGL的方法(所以,在之前就写过GL程序的同学有福了~~)。
不过,MC并不趋向于让使用者全部直接调用OpenGL的方法。为了处理光照、法线贴图等等属性的绘制,MC将OpenGL的绘制函数进行了一个包装,也就是Tessellator(镶嵌器)类。所有添加顶点、绘制多边形的操作,都需要通过这个类来进行。
在一个绘制过程中,我们可以这样获取Tessellator的实例:
- Tessellator t = Tessellator.instance;
复制代码- t.startDrawing(int MODE);
复制代码来开始一次绘制动作。
在绘制动作中,你可以设定当前绘制动作的颜色、设置面的法向量,以及添加一个顶点等等:
- t.setColorRGBA_F(r, g, b, a);
- t.setNormal(u, v, w);
- t.addVertexWithUV(x, y, z, u0, v0);……
复制代码在状态设置结束,添加了顶点之后,结束整个绘制过程:
此时,Tessellator会将计算好的渲染数据传递给OpenGL,进行实际的绘制。
说明:Tessellator的方法
t.startDrawing(MODE):使用指定的绘制模式
开始绘制。绘制模式和OpenGL的glBegin(MODE)中所使用的常量一模一样,有GL_QUADS, GL_LINES, GL_TRIANGLE_FAN等等,详见
这里
t.setColorOpaque(), setNormal(), ...:设置当前绘制过程的状态量。这也就意味着如果使用Tessellator进行这些状态的设定的话,同一个绘制call中,不同的顶点是无法使用不同的颜色和法向量值的。如果需要多种状态值,则推荐不同状态值分成不同的绘制call。
以下是一个使用Tessellator绘制一个红色,透明度50%,法向量为(0, 0, 1)的矩形的例子:
- Tessellator t = Tessellator.instance;
- t.startDrawing(GL11.GL_QUADS); //或t.startDrawingQuads()
- t.setColorRGBA_F(1.0F, 0.0F, 0.0F, 0.5F);
- t.setNormal(0, 0, 1);
- t.addVertex(0.0, 0.0, 0.0);
- t.addVertex(1.0, 0.0, 0.0);
- t.addVertex(1.0, 1.0, 0.0);
- t.addVertex(0.0, 1.0, 0.0);
- t.draw(); //结束绘制call
复制代码