2011-08-16 17 views
4

私はこのsource codeをベースに使用しており、私の要件に応じてコードを変更しようとしています。画像にメッシュを作成するためのコードを以下に示します。OpenGL iphone sdkでのメッシュ作成

- (ボイド)populateMesh {

verticalDivisions = kVerticalDivisions; 
horizontalDivisions = kHorisontalDivisions; 
unsigned int verticesArrsize = (kVerticalDivisions * ((2 + kHorisontalDivisions * 2) * 3)); 
unsigned int textureCoordsArraySize = kVerticalDivisions * ((2 + kHorisontalDivisions * 2) * 2); 
verticesArr = (GLfloat *)malloc(verticesArrsize * sizeof(GLfloat)); 
textureCoordsArr = (GLfloat*)malloc(textureCoordsArraySize * sizeof(GLfloat)); 
if (verticesArr == NULL) { 
    NSLog(@"verticesArr = NULL!"); 
} 
float height = kWindowHeight/verticalDivisions; 
float width = kWindowWidth/horizontalDivisions; 
int i,j, count; 
count = 0; 
for (j=0; j<verticalDivisions; j++) { 
    for (i=0; i<=horizontalDivisions; i++, count+=6) { //2 vertices each time... 
     float currX = i * width; 
     float currY = j * height; 
     verticesArr[count] = currX; 
     verticesArr[count+1] = currY + height; 
     verticesArr[count+2] = 0.0f;    
     verticesArr[count+3] = currX; 
     verticesArr[count+4] = currY; 
     verticesArr[count+5] = 0.0f; 
    } 
} 
float xIncrease = 1.0f/horizontalDivisions; 
float yIncrease = 1.0f/verticalDivisions; 
int x,y; 
//int elements; 
count = 0; 
for (y=0; y<verticalDivisions; y++) { 
    for (x=0; x<horizontalDivisions+1; x++, count+=4) { 
     float currX = x *xIncrease; 
     float currY = y * yIncrease; 
     textureCoordsArr[count] = (float)currX; 
     textureCoordsArr[count+1] = (float)currY + yIncrease; 
     textureCoordsArr[count+2] = (float)currX; 
     textureCoordsArr[count+3] = (float)currY; 
    } 
} 
// int cnt; 
// int cnt = 0; 
    NSLog(@"expected %i vertices, and %i vertices were done",(verticalDivisions * ((2 + horizontalDivisions*2) * 2)) , count); 
} 

drawViewコードである後。私は[自己populateMesh]と呼ばれているセットアップビューで

- (void)drawView:(GLView*)view; 
{ 
static GLfloat rot = 0.0; 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordsArr); 
glVertexPointer(3, GL_FLOAT, 0, verticesArr); 
glPushMatrix();{ 
    int i; 
    for (i=0; i<verticalDivisions; i++) { 
     glDrawArrays(GL_TRIANGLE_STRIP, i*(horizontalDivisions*2+2), horizontalDivisions*2+2); 
    } 
}glPopMatrix(); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 
} 

を関数の最後に追加します。 私の問題は、コードを変更した後に、画面に黒色の表示が表示されるという空白が表示されることです。誰かが私がどこで何か間違いをしているのを理解できますか?私はOpenGLの初心者で、メッシュを使って画像を操作しようとしています。できるだけ早く手伝ってください。前もって感謝します。

セットアップビューのコードは次のとおりです。

-(void)setupView:(GLView*)view {  

const GLfloat zNear = 0.01, zFar = 1000.0, fieldOfView = 45.0; 
GLfloat size; 
glEnable(GL_DEPTH_TEST); 
glMatrixMode(GL_PROJECTION); 
size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0); 
CGRect rect = view.bounds; 
glFrustumf(-size, size, -size/(rect.size.width/rect.size.height), size/ (rect.size.width/rect.size.height), zNear, zFar); 
glViewport(0, 0, rect.size.width, rect.size.height); 
glMatrixMode(GL_MODELVIEW); 
glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_SRC_COLOR); 
glGenTextures(1, &texture[0]); 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
NSString *path = [[NSBundle mainBundle] pathForResource:@"texture" ofType:@"png"]; 
NSData *texData = [[NSData alloc] initWithContentsOfFile:path]; 
UIImage *image = [[UIImage alloc] initWithData:texData]; 
if (image == nil) 
NSLog(@"Do real error checking here");  
GLuint width = CGImageGetWidth(image.CGImage); 
GLuint height = CGImageGetHeight(image.CGImage); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
void *imageData = malloc(height * width * 4); 
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

CGContextTranslateCTM (context, 0, height); 

CGContextScaleCTM (context, 1.0, -1.0); 

CGColorSpaceRelease(colorSpace); 

CGContextClearRect(context, CGRectMake(0, 0, width, height)); 

CGContextDrawImage(context, CGRectMake(0, 0, width, height),image.CGImage); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

CGContextRelease(context); 

free(imageData); 
[image release]; 
[texData release]; 
[self populateMesh]; 
} 

EDITこれは私が出したとして取得していますものです。期待通りですが、通常のグリッドは... enter image description here

+0

モデルビューと投影ビューのマトリックスを正しく設定しましたか?行列の初期設定でコードを提供できますか? – Prcela

+0

画像のピクセルサイズが2の累乗で表すことができることを確認してください。例:512x512 – Prcela

+0

設定したビューコードが含まれています。 populateMesh関数を実装する前に、私は画像を表示することができました... – DivineDesert

答えて

2

グリッドは、頂点の順序の仕方によって規則的ではありません。また、GL_TRIANGLE_STRIPが望ましいオプションであることを確かめてください。多分、GL_TRIANGLESはあなたが必要とするものです。

インデックス配列を使用すると、より簡単な解法を提案します。

0 1 2 
3 4 5 
6 7 8 

更新:

- (void) setup 
{ 
    vertices = (GLfloat*)malloc(rows*colums*3*sizeof(GLfloat)); 
    texCoords = (GLfloat*)malloc(rows*columns*2*sizeof(GLfloat)); 
    indices = (GLubyte*)malloc((rows-1)*(columns-1)*6*sizeof(GLubyte)); 

    float xDelta = horizontalDivisions/columns; 
    float yDelta = verticalDivisions/rows; 

    for (int i=0;i<columns;i++) { 
    for(int j=0;j<rows; j++) { 
     int index = j*columns+i; 
     vertices[3*index+0] = i*xDelta; //x 
     vertices[3*index+1] = j*yDelta; //y 
     vertices[3*index+2] = -10; //z 

     texCoords[2*index+0] = i/(float)(columns-1); //x texture coordinate 
     texCoords[2*index+1] = j/(float)(rows-1); //y tex coordinate 
    } 
    } 

    for (int i=0;i<columns-1;i++) { 
    for(int j=0;j<rows-1; j++) { 

    indices[6*(j*columns+i)+0] = j*columns+i; 
    indices[6*(j*columns+i)+1] = j*columns+i+1; 
    indices[6*(j*columns+i)+2] = (j+1)*columns+i; 

    indices[6*(j*columns+i)+3] = j*columns+i+1; 
    indices[6*(j*columns+i)+4] = (j+1)*columns+i+1; 
    indices[6*(j*columns+i)+5] = (j+1)*columns+i; 
    } 
} 
} 

- (void) dealloc { 
    free(vertices); free(texCoords); free(indices); 
} 

は実質的にこの順序はtringlesは、以下のようにレンダリングされることを意味する指標:

初期化コードの例のような通常のためにあなたのグリッドの頂点及びテクスチャアレイを作ります
(013)(143)(124)(254)(346)(476)... and so on. 

レンダリング方法では、次の行を使用します。

glVertexPointer(3, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glDrawElements(GL_TRIANGLES, 6*(columns-1)*(rows-1), GL_UNSIGNED_BYTE, indices); 

希望は役立ちます。

+0

ループを要素を描画する必要はありませんか? – DivineDesert

+0

ねえ..私のために働いていない...あなたは精巧にできますか? – DivineDesert

+0

小さなアップデートが追加されました。要素を描画するためのループは不要です。よりシンプルなソリューション。私はコードをテストしなかった、私はそれがいくつかのバグを含むかもしれないので私の頭からそれを書くが、コンセプトは明らかです。 – Prcela

3

zNear値でメッシュを切り出します。 z値を-2に変更してみてください。デフォルトで

verticesArr[count+2] = -2.0f; 
verticesArr[count+5] = -2.0f; 

、カメラを原点に位置し、負のz軸を下向き、および(0、1、0)のアップベクトルを有します。

あなたのメッシュは、視野外錐台(ピラミッド)であることに注意してください。 OpenGLの赤い本の中でそれをチェックアウト:

http://glprogramming.com/red/chapter03.html

+0

返信ありがとう... ur変更を編集し、glFrustumf()ステートメントにコメントした後、私は上記のビューを取得しています。私が以前に持っていたものと大きな違いはありません。しかし、他の何かが間違っている...あなたは把握できますか? – DivineDesert

1

Thisは、3Dグリッドを描く上の偉大なチュートリアルです。あなたに役立つコードが必要です。 3Dや2Dで作業しているかどうかはわかりませんが、2Dであってもニーズに合わせるのはかなり簡単です。希望が助けてくれる!

関連する問題