我建立一个IOS应用绘图和我有一个很难如何绘制在不同的点在屏幕上的油漆质感。 大多数在线教程指呈现在屏幕上具有一定规模的单一结构。
不过,我正在寻找的是提供2D顶点处绘制了基于用户触摸屏幕上计算出的漆质感的数组。
我用它并不需要我来指定用于绘制纹理贴图坐标和兴田原始目标点精灵。
然而,我想使用纹理坐标,以提供一个原始的对象(如使用三角形带绘制的四元组)。
如何做到这一点任何想法? 任何指针将是有益的。
注:Kunal
我建立一个IOS应用绘图和我有一个很难如何绘制在不同的点在屏幕上的油漆质感。 大多数在线教程指呈现在屏幕上具有一定规模的单一结构。
不过,我正在寻找的是提供2D顶点处绘制了基于用户触摸屏幕上计算出的漆质感的数组。
我用它并不需要我来指定用于绘制纹理贴图坐标和兴田原始目标点精灵。
然而,我想使用纹理坐标,以提供一个原始的对象(如使用三角形带绘制的四元组)。
如何做到这一点任何想法? 任何指针将是有益的。
注:Kunal
如果我理解正确的,你想画许多纹理(相同图像)的点,用户触摸屏幕。 对于我的粒子系统我用这个:
float squarevData[12]={
-1,1,
1,1,
-1,-1,
1,1,
1,-1,
-1,-1,
};
float squarevData2[12]={
-1,1,
1,1,
-1,-1,
1,1,
1,-1,
-1,-1,
};
class BatchRenderer
{
public:
float* partVdata;
float* partCdata;
float* partTdata;
int counter1,counter2,counter3;
int count;
bool isz;
BatchRenderer(int maxTextures,bool iszi)
{
isz=iszi;
if(isz)partVdata=(float*)malloc(maxTextures*18*4);
else partVdata=(float*)malloc(maxTextures*12*4);
partCdata=(float*)malloc(maxTextures*24*4);
partTdata=(float*)malloc(maxTextures*12*4);
}
void Draw(float x,float y,float z,float scalex,float scaley,float angle,float r,float g,float b,float a)
{
angle*=0.017453f;
for(int c2=0;c2<12;c2+=2)
{
float x=squarevData[c2]*scalex;
float y=squarevData[c2+1]*scaley;
float cos1=cos(angle);
float sin1=sin(angle);
squarevData2[c2] = (cos1*x) - ( sin1*y);
squarevData2[c2+1] = (sin1*x) + ( cos1*y);
}
partVdata[counter1++]=x+squarevData2[0];
partVdata[counter1++]=y+squarevData2[1];
if(isz)partVdata[counter1++]=z;
partCdata[counter2++]=r;
partCdata[counter2++]=g;
partCdata[counter2++]=b;
partCdata[counter2++]=a;
partTdata[counter3++]=0;
partTdata[counter3++]=1;
partVdata[counter1++]=x+squarevData2[2];
partVdata[counter1++]=y+squarevData2[3];
if(isz)partVdata[counter1++]=z;
partCdata[counter2++]=r;
partCdata[counter2++]=g;
partCdata[counter2++]=b;
partCdata[counter2++]=a;
partTdata[counter3++]=1;
partTdata[counter3++]=1;
partVdata[counter1++]=x+squarevData2[4];
partVdata[counter1++]=y+squarevData2[5];
if(isz)partVdata[counter1++]=z;
partCdata[counter2++]=r;
partCdata[counter2++]=g;
partCdata[counter2++]=b;
partCdata[counter2++]=a;
partTdata[counter3++]=0;
partTdata[counter3++]=0;
partVdata[counter1++]=x+squarevData2[6];
partVdata[counter1++]=y+squarevData2[7];
if(isz)partVdata[counter1++]=z;
partCdata[counter2++]=r;
partCdata[counter2++]=g;
partCdata[counter2++]=b;
partCdata[counter2++]=a;
partTdata[counter3++]=1;
partTdata[counter3++]=1;
partVdata[counter1++]=x+squarevData2[8];
partVdata[counter1++]=y+squarevData2[9];
if(isz)partVdata[counter1++]=z;
partCdata[counter2++]=r;
partCdata[counter2++]=g;
partCdata[counter2++]=b;
partCdata[counter2++]=a;
partTdata[counter3++]=1;
partTdata[counter3++]=0;
partVdata[counter1++]=x+squarevData2[10];
partVdata[counter1++]=y+squarevData2[11];
if(isz)partVdata[counter1++]=z;
partCdata[counter2++]=r;
partCdata[counter2++]=g;
partCdata[counter2++]=b;
partCdata[counter2++]=a;
partTdata[counter3++]=0;
partTdata[counter3++]=0;
count++;
}
void RenderStart()
{
counter1=counter2=count=counter3=0;
}
void RenderStop(int textureid)
{
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glBindTexture(GL_TEXTURE_2D, textureid);
glTexCoordPointer(2, GL_FLOAT, 0, partTdata);
glColorPointer(4, GL_FLOAT, 0,partCdata );
if(isz)glVertexPointer(3, GL_FLOAT, 0, partVdata);
else glVertexPointer(2, GL_FLOAT, 0, partVdata);
glDrawArrays(GL_TRIANGLES, 0, count*6);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
};
如何使用它?
BatchRenderer* br=new BatchRenderer(500,false)//the max number of textures that can be drawn , and if you want z axis
void Render()
{
br->RenderStart();
for(int c=0;c<POINTS;c++)
{
br->Draw(p[c].x,p[c].y,0,p[c].scalex,p[c].scaly,p[c].angle,p[c].r,p[c].g,p[c].b,p[c].a);
}
br->RenderStop(yourtextureid);
}
您可以绘制60 fps的500个多纹理与MID设备,你可以有独特的缩放,旋转和颜色各
我终于得到了这个工作。 我提请用户触摸作为TRIANGLE_STRIP原始的,其中的两个一起导致正方形的每个点。
GLfloat *tBuffer = malloc(4 * 2 * sizeof(GLfloat));
tBuffer[0] = 0.0;
tBuffer[1] = 1.0;
tBuffer[2] = 1.0;
tBuffer[3] = 1.0;
tBuffer[4] = 0.0;
tBuffer[5] = 0.0;
tBuffer[6] = 1.0;
tBuffer[7] = 0.0;
glTexCoordPointer(2, GL_FLOAT, 0, tBuffer);
CGFloat padding = 16;
vBuffer[0] = xCenter - padding;
vBuffer[1] = yCenter - padding;
vBuffer[2] = xCenter + padding;
vBuffer[3] = yCenter - padding;
vBuffer[4] = xCenter - padding;
vBuffer[5] = yCenter + padding;
vBuffer[6] = xCenter + padding;
vBuffer[7] = yCenter + padding;
CGFloat degrees = atan2(end.y - start.y, end.x - start.x) * 180 / M_PI;
// rotate the texture in the direction of the stroke.
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glTranslatef(0.5, 0.5, 0);
glRotatef(degrees, 0, 0, 1);
glTranslatef(-0.5, -0.5, 0);
glVertexPointer(2, GL_FLOAT, 0, vBuffer);
glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
x中心,y中心是用户触摸。 填充确定原始的尺寸。
我还旋转纹理,但转动,由于旋转与原点否则枢轴发生之前将其转换到中心。
希望这可以帮助!
更新 :
我能减少一些OpenGL调用由1通过运行下面的一组用于代替旋转命令:
请注意,我能够通过运行以下命令集的旋转,以减少调用由1 OpenGL的数量,(删除推/弹出矩阵)
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(0.5, 0.5, 0);
[GLManager rotateBrush:degrees];
glTranslatef(-0.5, -0.5, 0);
[GLManager drawVertexBuffer:vBuffer withVertexNumber:4];
glMatrixMode(GL_MODELVIEW);`