metahook吧 关注:756贴子:11,755
  • 10回复贴,共1

[+1s]World Draw Texture

只看楼主收藏回复

嘛..吧里的教程基本上都是在HUD上画纹理,今天让我来讲一讲怎么在3D世界中画纹理吧~~
首先Hook HUD_DrawNormalTriangles函数,方法是在LoadClient里pExportFunc->HUD_DrawNormalTriangles = HUD_DrawNormalTriangles;
接下来一切都可以在HUD_DrawNormalTriangles函数里进行了:
先用gEngfuncs.pfnSPR_Load读取一张纹理,然后gEngfuncs.GetSpritePointer获取纹理指针,写在一行就是model_t *MyTexture = (struct model_s *)gEngfuncs.GetSpritePointer( gEngfuncs.pfnSPR_Load( "sprites/320hud3.spr" ) );
然而你会发现MetaHook里本身是没带model_t这一类型的,所以我们需要手动创建一下:

再接着就是用gEngfuncs.pTriAPI->SpriteTexture对纹理进行绑定然后设定一下渲染方案:

完事之后就可以开始绘制工作了。
1.绘制出一个三角形
使用TRI_TRIANGLES来绘制三角形,使用pTriAPI->Vertex3f指定出三个顶点坐标(直接使用世界坐标就行了),使用pTriAPI->TexCoord2f分配纹理。

效果图:
绘制出一个矩形:
由于HUD_DrawNormalTriangles函数内似乎仅限绘制三角形,也就是说不管是TRI_QUADS还是TRI_POLYGON最终显示出来的只能是一个三角形,所以要使用TRI_TRIANGLES绘制出两个三角形进而拼成一个矩形,但更简单的方法是使用TRI_TRIANGLE_STRIP进行三角形的连续绘制

效果图:
绘制出一个正方体:
仍然是使用TRI_TRIANGLE_STRIP连续绘制三角形最终拼成一个正方体,但是这个难度稍微大一点,所以先要搞清楚TRI_TRIANGLE_STRIP的绘制规律,个人认为只要记住一点:新的顶点将以次新的两个顶点为三角形的底从而产生新的三角形。附上一张说明图:

然后代码就比较长了:
gEngfuncs.pTriAPI->Begin( TRI_TRIANGLE_STRIP );// 连续绘制三角形
// 绘制三角形
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );// 纹理坐标1
gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, -250.0f );// 点1坐标 左下
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );// 纹理坐标2
gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, 250.0f ); // 点2坐标 左上
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );// 纹理坐标3
gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, -250.0f );// 点3坐标 右下
// >> 绘制正方体 后面
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );// 纹理坐标4
gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, 250.0f );// 点4坐标 右上
// >> 绘制正方体 左面
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );// 纹理坐标5
gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, -250.0f );// 点5
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, 250.0f );
// >> 绘制正方体 前面
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );//10 11 01 00 00 00 10
gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, -250.0f );
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );//11 10 00 01 10 00 00
gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, 250.0f );
// >> 绘制正方体 右面
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, -250.0f );
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, 250.0f );
gEngfuncs.pTriAPI->End();// 结束绘制
gEngfuncs.pTriAPI->Begin( TRI_TRIANGLE_STRIP );// 连续绘制三角形
// 绘制三角形
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, 250.0f );
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, 250.0f );
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );
gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, 250.0f );
// >> 绘制正方体 顶面
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );
gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, 250.0f );
gEngfuncs.pTriAPI->End();// 结束绘制
gEngfuncs.pTriAPI->Begin( TRI_TRIANGLE_STRIP );// 连续绘制三角形
// 绘制三角形
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, -250.0f );
gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, -250.0f );
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );
gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, -250.0f );
// >> 绘制正方体 底面
gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );
gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, -250.0f );
gEngfuncs.pTriAPI->End();// 结束绘制
这段代码中一共进行了三次绘制,第一次绘制出正方体的前后左右四个面,第二次绘制出正方体的顶面,最后一次绘制出正方体的底面。
效果图:
然而SPR纹理的效果不是很好,可能有朋友会问怎么使用BMP PNG GIF BIK之类的纹理,换成OpenGL就行了


IP属地:日本本楼含有高级字体1楼2017-01-20 18:02回复
    TRI_QUADS


    IP属地:广东来自Android客户端2楼2017-01-20 20:06
    收起回复
      厉害


      3楼2017-01-20 20:55
      回复
        说好的DrawNormalTriangles呢!挂羊头卖狗肉呀!!!!
        下面是用QUAD来进行绘制的代码
        绘制出一个正方形:

        绘制出一个正方体:
        gEngfuncs.pTriAPI->Begin( TRI_QUAD_STRIP );// 绘制四边形带
        // >> 正方体右面
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, 250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, 250.0f );
        // >> 正方体后面
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, 250.0f );
        gEngfuncs.pTriAPI->End();// 结束绘制
        gEngfuncs.pTriAPI->Begin( TRI_QUAD_STRIP );// 绘制四边形带
        // >> 正方体底面
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, -250.0f );
        // >> 正方体左面
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, 250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, 250.0f );
        gEngfuncs.pTriAPI->End();// 结束绘制
        gEngfuncs.pTriAPI->Begin( TRI_QUAD_STRIP );// 绘制四边形带
        // >> 正方体前面
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, -250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, 250.0f, 250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 1.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, 250.0f, 250.0f );
        // >> 正方体顶面
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 1.0f );
        gEngfuncs.pTriAPI->Vertex3f( 250.0f, -250.0f, 250.0f );
        gEngfuncs.pTriAPI->TexCoord2f( 0.0f, 0.0f );
        gEngfuncs.pTriAPI->Vertex3f( -250.0f, -250.0f, 250.0f );
        gEngfuncs.pTriAPI->End();// 结束绘制
        说明图:


        IP属地:日本本楼含有高级字体5楼2017-01-20 21:56
        收起回复
          为何那么叼


          IP属地:广东来自Android客户端6楼2017-01-21 00:00
          回复


            IP属地:四川来自Android客户端7楼2017-01-21 11:23
            回复