1

現時点では、自分の問題がどこにあるのかよくわかりません。ロードされた画像をテクスチャとして問題なく描画できますが、charを含むビットマップを生成しようとすると、ブラックボックスが表示されます。

問題は、テクスチャを生成してアップロードするときにあると確信しています。

そのための方法は次のとおりです。ifステートメントの上部は、ファイル(res / texture.jpg)からロードされた画像のテクスチャを描画するだけで、完全に描画されます。また、ifステートメントのelse部分は、char(変数char enter)がオンの状態でテクスチャを生成してアップロードしようとします。

出力

ソースコード、必要に応じてシェーダーやC ++を追加しますが、画像には問題なく機能します。

    void uploadTexture()
    {
        if(enter=='/'){

            // Draw the image.
            GLenum imageFormat;
            glimg::SingleImage image = glimg::loaders::stb::LoadFromFile("res/texture.jpg")->GetImage(0,0,0);
            glimg::OpenGLPixelTransferParams params =  glimg::GetUploadFormatType(image.GetFormat(), 0);
            imageFormat = glimg::GetInternalFormat(image.GetFormat(),0);

            glGenTextures(1,&textureBufferObject);
            glBindTexture(GL_TEXTURE_2D, textureBufferObject);

            glimg::Dimensions dimensions = image.GetDimensions();
            cout << "Texture dimensions w "<< dimensions.width << endl;
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, dimensions.width, dimensions.height, 0, params.format, params.type, image.GetImageData());
        }else
        {
            // Draw the char useing the FreeType Lib
            FT_Init_FreeType(&ft);
            FT_New_Face(ft, "arial.ttf", 0, &face);
            FT_Set_Pixel_Sizes(face, 0, 48);

            FT_GlyphSlot g = face->glyph;


            glGenTextures(1,&textureBufferObject);
            glBindTexture(GL_TEXTURE_2D, textureBufferObject);

            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

            FT_Load_Char(face, enter, FT_LOAD_RENDER);
            FT_Bitmap theBitmap = g->bitmap;

            int BitmapWidth = g->bitmap.width;
            int BitmapHeight = g->bitmap.rows;



            cout << "draw char - " << enter << endl;
            cout << "g->bitmap.width - " << g->bitmap.width << endl;
            cout << "g->bitmap.rows - " << g->bitmap.rows << endl;

            int TextureWidth =roundUpToNextPowerOfTwo(g->bitmap.width);
            int TextureHeight =roundUpToNextPowerOfTwo(g->bitmap.rows);

            cout << "texture width x height - " << TextureWidth <<" x " << TextureHeight << endl;

            GLubyte* TextureBuffer = new GLubyte[ TextureWidth * TextureWidth ];
            for(int j = 0; j < TextureHeight; ++j)
            {
                for(int i = 0; i < TextureWidth; ++i)
                {
                    TextureBuffer[ j*TextureWidth + i ] = (j >= BitmapHeight || i >= BitmapWidth ? 0 : g->bitmap.buffer[ j*BitmapWidth + i ]);
                }
            }

            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, TextureWidth, TextureHeight, 0, GL_RGB8, GL_UNSIGNED_BYTE, TextureBuffer);
        }

    } 
4

2 に答える 2

2

OpenGLの部分についてはよくわかりませんが、FTビットマップを処理するためのアルゴリズムが正しくありません。FTビットマップの各行のバイト数はですbitmap->pitch。各ピクセルの数は、キャラクターをロードしているレンダリングモードによっても異なります。たとえば、の場合、各ピクセルbitmap->pixel_modeFT_PIXEL_MODE_LCDR、G、Bの順に3バイトとしてエンコードされ、値は実際にはアルファマスク値ですが、ピクセルモードの場合FT_PIXEL_MODE_GRAY、各ピクセルは1バイトで、値は灰色です。レベル。

http://freetype.sourceforge.net/freetype2/docs/reference/ft2-basic_types.html#FT_Bitmapをご覧ください

于 2012-06-18T20:56:07.140 に答える
0

私が最初にすることは、FreetypeがほとんどすべてのFT_*関数に与える戻りコードを調べることです。

とにかくそれは良い習慣ですが、問題がある場合は大幅に絞り込む必要があります。

于 2012-06-18T21:46:26.747 に答える