Opengl ES 2.0中怎么描画点线
发布时间:2011-07-03 07:01:16 文章来源:www.iduyao.cn 采编人员:星星草
Opengl ES 2.0中如何描画点线?
Opengl ES 2.0中如何描画点线?
在Opengl中可以使用line stipple标志来描画点线,但是在Opengl ES中,line stipple标志已经被裁减了,没有了,所以在Opengl ES 2.0中,想要描画点线,应该如何实现,有没有性能上比较好的方法?
------解决方案--------------------
我自己写了个点线的描画算法,给大家贴出来!!!
OnTestLineStipple是入口函数,这里指写了算法,具体画线的Opengl ES 函数被封装了,没有贴出来。
int makeLineStipplePoint(
int iStippleDistance,
void* pvBuffer,
int iBufferSize,
char* pcFlagBufferSize,
int* piPointCount,
int size,
int iDimension,
void* pvPointer
)
{
short* pPoint = pvPointer;
short* pBuffer = pvBuffer;
int iBufferIndxe = 0;
float fDistance,fDistDiff,xNormalizeVector,yNormalizeVector;
float fDistanceTmp = iStippleDistance;
int x,y,xBase,yBase;
int xPre = 0xfffffff;
int yPre = xPre;
int iFlagBufferIndex = 0;
char cFlagBufferBitIndex = 0x80;
char cIsDraw = 0xff;
if( ( NULL == pvBuffer ) || ( NULL == pcFlagBufferSize ) || ( NULL == pvPointer ) )
{
return -1;
}
iBufferSize /= (size * iDimension);
xBase = x = *pPoint;
yBase = y = *(pPoint+1);
pBuffer[iBufferIndxe++] = *pPoint++;
pBuffer[iBufferIndxe++] = *pPoint++;
if(iDimension == 3)
{
pBuffer[iBufferIndxe++] = *pPoint++;
}
(*piPointCount)--;
x -= *pPoint;
y -= *(pPoint+1);
while( ( --iBufferSize ) && (*piPointCount) )
{
fDistance = sqrtf( x * x + y * y );
fDistDiff = fDistance - fDistanceTmp;
if( fDistDiff < -1.0f )
{
//插入已有点的分支
xBase = x = *pPoint;
yBase = y = *(pPoint+1);
pBuffer[iBufferIndxe++] = *pPoint++;
pBuffer[iBufferIndxe++] = *pPoint++;
if(iDimension == 3)
{
pBuffer[iBufferIndxe++] = *pPoint++;
}
(*piPointCount)--;
memcpy( &pBuffer[iBufferIndxe], &pBuffer[iBufferIndxe-iDimension], (size * iDimension) );
iBufferIndxe += iDimension;
--iBufferSize;
x -= *pPoint;
y -= *(pPoint+1);
pcFlagBufferSize[iFlagBufferIndex] = cFlagBufferBitIndex & cIsDraw;
fDistanceTmp -= fDistance;
}
else if( fDistDiff > 1.0f )
{
//插入新点的分支
int iXFlag = ( x >= 0 ) ? -1 : 1;
int iYFlag = ( y >= 0 ) ? -1 : 1;
if( xPre != x )
{
xPre = x;
xNormalizeVector = abs((float)x) / fDistance * iXFlag;
xNormalizeVector *= fDistanceTmp;
}
if( yPre != y )
{
yPre = y;
yNormalizeVector = abs((float)y) / fDistance * iYFlag;
yNormalizeVector *= fDistanceTmp;
}
xBase += AROUND(xNormalizeVector);
yBase += AROUND(yNormalizeVector);
pBuffer[iBufferIndxe++] = xBase;
pBuffer[iBufferIndxe++] = yBase;
if(iDimension == 3)
{
pBuffer[iBufferIndxe++] = pBuffer[iBufferIndxe-3];
}
pcFlagBufferSize[iFlagBufferIndex] = cFlagBufferBitIndex & cIsDraw;
cIsDraw = ~cIsDraw;
x = xBase - *pPoint;
y = yBase - *(pPoint+1);
fDistanceTmp = iStippleDistance;
}
else //( fDistance == fDistanceTmp )
{
xBase = x = *pPoint;
yBase = y = *(pPoint+1);
pBuffer[iBufferIndxe++] = *pPoint++;
pBuffer[iBufferIndxe++] = *pPoint++;
if(iDimension == 3)
{
pBuffer[iBufferIndxe++] = *pPoint++;
}
(*piPointCount)--;
x -= *pPoint;
y -= *(pPoint+1);
pcFlagBufferSize[iFlagBufferIndex] = cFlagBufferBitIndex & cIsDraw;
cIsDraw = ~cIsDraw;
fDistanceTmp = iStippleDistance;
}
}
if( (*piPointCount) < iBufferSize )
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
正式开始学习云计算
RT 我是学JAVA的 由于工作需要开始学习云计算 谢谢各位大神帮助
以下是我的观点
云计...
-
关于云技术
谁能给我讲讲云计算到底是嘛东西
------解决方案--------------------
云计算(英语:cloud computing),是一种基于互联网...
-
基于命令行的API函数解释执行工具
求:基于命令行的API函数解释执行工具。
也就是能执行API函数的外部CMD命令。
如果没有这样...
-
webAPI和socket相比?
现在各大网站都提供其webAPI给开发者开发应用,如微博API等。但webAPI大多需要授权,而且有些功能还会根据授权的...
-
Facebook开放构架,平台圈地竞争升级
12月13日,Facebook宣布将把开发平台架构开放给其它社交网站:
Facebook 资深平台经理Ami Vora日...
-
计算机视觉的课程安排
我想问一下计算机视觉的研究方向的课程安排有哪些???要详细一点的,谢谢各位了!!!
------解决方案---------------...
-
求FaceBook开发实例
rt
对OpenAPI开发不了解,想了解一下……
不知道怎么入手了解。所以想要个实例看看。
------解决方案--------...
-
opengl要用到几个库
学过opengl的同学们,我刚上手不久,对许多函数还不是很了解,不知道用GL做一些图形程序时要用到哪些库。起初我只...
-
opengl图形旋转与放缩问题
下面是程序代码的一部分,运行结果是图形不能实现绕形心旋转,
请高手指点一下:
// Begin a new triangle ...
-
~~~~~注册facebook API key的问题.....
我的一个桌面应用程序,需要向facebook上面上传图片。是不是需要先注册api key才能访问face...