0

これが私のコードです:

-(void) mergeWithImage:(UIImage*) image{
    if(image==nil){
        return;
    }
glPushMatrix();
    glColor4f(256,
              256,
              256,
              1.0);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    glGenTextures(1, &stampTexture);
    glBindTexture(GL_TEXTURE_2D, stampTexture);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);



    GLuint imgwidth = CGImageGetWidth(image.CGImage);
    GLuint imgheight = CGImageGetHeight(image.CGImage);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    void *imageData = malloc( imgheight * imgwidth * 4 );
    CGContextRef context2 = CGBitmapContextCreate( imageData, imgwidth, imgheight, 8, 4 * imgwidth, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
    CGContextTranslateCTM (context2, 0, imgheight);
    CGContextScaleCTM (context2, 1.0, -1.0);
    CGColorSpaceRelease( colorSpace );
    CGContextClearRect( context2, CGRectMake( 0, 0, imgwidth, imgheight ) );
    CGContextTranslateCTM( context2, 0, imgheight - imgheight );
    CGContextDrawImage( context2, CGRectMake( 0, 0, imgwidth, imgheight ), image.CGImage );

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgwidth, imgheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

    CGContextRelease(context2);


    free(imageData);

    static const GLfloat texCoords[] = {
        0.0, 1.0,
        1.0, 1.0,
        0.0, 0.0,
        1.0, 0.0
    };

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);   


    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    /*

     These array would need to be changed if the size of the paintview changes. You must make sure that all image imput is 64x64, 256x256, 512x512 or 1024x1024.  In this we are using 512, but you can use 1024 as follows:

     use the numbers:
     {
     0.0, height, 0.0,
     1024, height, 0.0,
     0.0, height-1024, 0.0,
     1024, height-1024, 0.0
     }
     */


    static const GLfloat vertices[] = {
        0.0, 1024, 0.0,
        1024, 1024, 0.0,
        0.0, 0, 0.0,
        1024, 0, 0.0
    };

    static const GLfloat normals[] = {
        0.0, 0.0, 1024,
        0.0, 0.0, 1024,
        0.0, 0.0, 1024,
        0.0, 0.0, 1024
    };

glBindTexture(GL_TEXTURE_2D, stampTexture);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glNormalPointer(GL_FLOAT, 0, normals);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glPopMatrix();

glDeleteTextures( 1, &stampTexture );
//set back the brush
glBindTexture(GL_TEXTURE_2D, brushTexture);

glColor4f(lastSetRed,
          lastSetGreen,
          lastSetBlue,
          1.0);

// Display the buffer
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

画像が 1024x1024 の場合は問題なく動作しますが、サイズが 1024x768 の画像がある場合、頂点と法線に割り当てる値は何ですか?

4

2 に答える 2

2

頂点と法線に割り当てる値は何ですか?

これらは、テクスチャ座標に (直接) 干渉しないため、問題ではありません。ところで、法線は常に単位長でなければなりません。また、ライティングを適用したくない場合は、法線は必要ありません。また、照明法線を適用する場合は、単位長である必要があります。

通常のテクスチャのテクスチャ座標は、画像の縦横比に関係なく、常に [0;1] の範囲にあります。頂点の位置は、使用する投影法に従って選択する必要があります。たとえば、

glOrtho(0, texture_width, 0, textture_height, …)

投影すると、頂点は {0, texture_width}×{0, texture_height} になります。あなたの問題に対する決定的な答えはありません。

于 2013-01-18T11:06:08.897 に答える
0

テクスチャをバインドするときにこれらの線を追加します

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //IMPORTANT FOR NON POWER OF 2 TEXTURES
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
于 2013-01-18T10:40:41.507 に答える