opengl画任意多边形,opengl绘制六边形
四边形绘制是Opengl ES中非常重要的技能。比如你是一个视频播放器,你需要用Opengl ES画四边形。但是,在Opengl ES中并没有直接提供。
画四边形的关联函数,那么四边形怎么画?
在Opengl ES的世界里,所有的元素都是由点、线、三角形组成的。众所周知,四边形可以分为两个三角形,所以在Opengl ES的世界里,四边形的绘制可以分为绘制两个三角形的任务。
三角形绘制请参考上一篇文章:OpenglEs中的三角形绘制。
为了让项目代码更好的展现我们的演示效果,我们先把前面的代码抽象出来,做一个简单的包,统一一个BaseGlActivity:
公共类BaseGlActivity扩展了AppCompatActivity {
受保护的BaseOpengl baseOpengl
私有MyGLSurfaceView MyGLSurfaceView;
@覆盖
受保护的void onCreate(@ Nullable Bundle savedInstanceState){
super . oncreate(savedInstanceState);
setContentView(r . layout . activity _ base _ GL);
base OpenGL=create OpenGL();
myGLSurfaceView=findViewById(r . id . my _ GL _ surface _ view);
if(null!=baseOpengl){
myglsurfaceview . setbase OpenGL(base OpenGL);
myGLSurfaceView . setondrawlister(新的MyGLSurfaceView。OnDrawListener() {
@覆盖
公共void onDrawFrame() {
base OpenGL . ongldraw();
@覆盖
受保护的void onDestroy() {
if(null!=baseOpengl){
base OpenGL . release();
super . on destroy();
//子类可以简单的返回具体的Opelg实体。
public base OpenGL create OpenGL(){
返回null
}
其他代码,比如BaseOpengl和MyGLSurfaceView,和之前一样。
然后,在Java层和C中都创建了一个新的RectOpengl类来表示绘制四边形。
RectOpengl.java
公共类RectOpengl扩展BaseOpengl{
公共RectOpengl() {
超级(BaseOpengl。DRAW _ TYPE _ RECT);
}
RectOpengl.h
# IFN def NDK _ OpenGL es _ LEARN _ rect OpenGL _ H
#定义NDK _ OPENGLES _ LEARN _ rect OpenGL _ H
#include BaseOpengl.h
类RectOpengl:public BaseOpengl {
公共:
rect OpenGL();
virtual ~ rect OpenGL();
虚拟void onDraw();
私人:
闪烁位置句柄{-1 };
闪烁color handle {-1 };
# endif//NDK _ OPENGLES _ LEARN _ rect OpenGL _ H
用六个顶点画四边形
这是大家能想到的最简单的办法。每个三角形需要三个顶点,而画两个三角形需要六个顶点。通过调整顶点,两个三角形相邻形成一个四边形。
所以我们的顶点着色器和片段着色器不需要修改,用之前画三角形的那些着色器就可以了。
例如,使用以下六个顶点绘制两个三角形:
//用画两个三角形的形式组成一个矩形GL_TRIANGLES
//const静态GLfloat顶点[]={
////第一个三角形
//0.5f,0.5f,
//-0.5f,0.5f,
//-0.5f,-0.5f,
////第二个三角形
//-0.5f,-0.5f,
//0.5f,-0.5f,
//0.5f,0.5f
//6个顶点画两个三角形组成一个矩形GL_TRIANGLES
//glDrawArrays(GL_TRIANGLES,0,6);
这个比较简单理解,我就不画说明图了。
画有四个顶点的四边形。
用四个顶点画两个三角形主要是重用一些顶点,然后在glDrawArrays函数中画三角形。
//4个顶点绘制两个三角形形成一个矩形
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
GL _ Triangle _ Stripe将重用以前的顶点。因为顶点是重用的,所以这个方法可以画n-2个三角形(n是顶点的个数)。
例如,可以使用具有以下顶点坐标的三角形带来绘制矩形:
const static GLfloat顶点[]={
0.5f,-0.5f,//右下方
0.5f,0.5f,//右上
-0.5f,-0.5f,//左下方
-0.5f,0.5f //左上
};
如果有1、2、3、4四个顶点坐标,GL _ triangle _ stripe画三角形的方式是顶点1、2、3组成三角形,顶点2、3、4组成三角形。
具体见图:
RectOpengl的完整代码:
#include RectOpengl.h
#包含./utils/Log.h
//顶点着色器
静态常量char *ver=#version 300 es\n
在vec4 aColor中;\n
在vec4位置;\n
输出vec 4 vcolor\n
请参见main() {\n
vcolor=控制器;\n
总帐_位置=缩进:\n
} ;
//片元着色器
静态const char * fragment= # version 300 es \ n
精密中间泵浮动;\n
在vec 4 vcolor中\n
out vec 4 fragcolor\n
请参见main() {\n
fragcolor=vcolor\n
} ;
//使用绘制两个三角形组成一个矩形的形式GL _三角形(三角形)
//常量静态GLfloat顶点[]=>
////第一个三角形
//0.5f,0.5f,
-0.5f,0.5f,
-0.5f,-0.5f,
////第二个三角形
-0.5f,-0.5f,
//0.5f,-0.5f,
//0.5f,0.5f
//使用绘制两个三角形组成一个矩形的形式(三角形带)
//第一第二第三个点组成一个三角形,第二第三第四个点组成一个三角形
常数静态GLfloat顶点[]=>
0.5f,-0.5f,//右下
0.5f,0.5f,//右上
-0.5f,-0.5f,//左下
-0.5f,0.5f //左上
//rgba
常数静态GL float color _ ice[]=>
0.0f,0.0f,1.0f,1.0f
direct OpenGL:direct OpenGL():base OpenGL()& gt;
initGlProgram(参见碎片);
position handle=glgetatliblocation(程序,清除);
color handle=glgetattributelocation(程序、“颜色”;
LOGD(’程序:%d,程序);
LOGD(positionHandle:%d,位置句柄);
LOGD(colorHandle:%d,颜色句柄);
请参阅直接OpenGL:ondraw()=>
//清屏
glClearColor(0.0f,1.0f,0.0f,1.0f);
GL _ color _ buffer _ bit(GL _ color _ buffer _位元):
葡萄糖程序(程序);
*大小几个数字表示一个点,显示是两个数字表示一个点
*标准化是否需要归一化,不用,这里已经归一化了
*步幅步长,连续顶点之间的间隔,如果顶点直接是连续的,也可填0
glverticalpointer(位置句柄,2,GL_FLOAT,GL_FALSE,0,顶点);
//启用顶点数据
glenablevertxatiribarray(位置手柄);
//这个不需要glenablevertexattribarray(格勒列弗列札列耶夫格列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫列夫)
glvertxattrib 4 Fv(颜色句柄,color _ ices);
//6个顶点绘制两个三角形组成矩形
//glDrawArrays(GL_TRIANGLES,0.6);
//4个顶点绘制两个三角形组成矩形
glDrawArrays(GL_TRIANGLE_STRIP,0.4);
Glu sep程序(0);
//禁用顶点
gldisablevertexattribarray(位置句柄);
如果(零精度!=eghelper .]
eglhelper交换缓冲区();
直接OpenGL:~直接OpenGL()no xcept[
}
DrawRectActivity.java
公共类drawrect活动扩展了base glactivity[
@覆盖
公共库OpenGL createopengl()>
返回新的矩形OpenGL();
}
计算机图形学是之-他环境搭建
计算机图形学是之着色器
计算机图形学是之三角形绘制
关注我,一起进步,人生不止编码!编码!
来自51吨重博客作者思想觉悟的原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。