質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%

Q&A

解決済

1回答

2680閲覧

なんとかしてテクスチャーをだしたい

txty

総合スコア303

0グッド

1クリップ

投稿2020/07/30 08:31

編集2022/08/01 02:27

前提・実現したいこと
DDSファイルからテクスチャを読み込みたいです。何が原因か絞りきれないです。

解凍作業してみたので、内容を変えました。シェーダの習得より、早くテクスチャができそうなので内容を変える要因になりました。

問題:課題:コピーしたのにddsファイルから正しく出力されない

opengl

1 2typedef struct _DDPixelFormat 3{ 4 GLuint size; 5 GLuint flgas; 6 GLuint fourCC; 7 GLuint bpp; 8 GLuint redMask; 9 GLuint greenMask; 10 GLuint blueMask; 11 GLuint alphaMask; 12} 13DDPixelFormat; 14 15typedef struct _DDSCaps 16{ 17 GLuint caps; 18 GLuint caps2; 19 GLuint caps3; 20 GLuint caps4; 21} 22 23DDSCaps; 24 25typedef struct _DDColorKey 26{ 27 GLuint lowVal; 28 GLuint highVal; 29} 30DDColorKey; 31 32typedef struct _DDSurfaceDesc 33{ 34 GLuint size; 35 GLuint flags; 36 GLuint height; 37 GLuint width; 38 GLuint pitch; 39 GLuint depth; 40 GLuint mipMapLevels; 41 GLuint alphaBitDepth; 42 GLuint reserved; 43 GLuint surface; 44 DDColorKey ckDestOverlay; 45 DDColorKey ckDestBlt; 46 DDColorKey ckSrcOverlay; 47 DDColorKey ckSrcBlt; 48 DDPixelFormat format; 49 DDSCaps caps; 50 GLuint textureStage; 51} 52DDSurfaceDesc; 53 54void DdsLoader(const char* filename){ 55//ReadDDS 56 FILE *fa=fopen(filename,"r"); 57 58 char magic[4]; 59 60 DDSurfaceDesc ddsd; 61 62 fread(&magic, sizeof(char), 4, fa); //修正したが2サイトとも&magicなので元に戻した  63 64 fread(&ddsd, sizeof(ddsd), 1, fa); 65 66 67 //3TXD 68 GLenum format =GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; 69 70 GLuint internalFormat=4; 71 72 int mipmapFacter=4; 73 74 unsigned long current = ftell(fa); 75 76 77 78 fseek(fa, 0L, SEEK_END); 79 80 unsigned long end= ftell(fa); 81 82 unsigned long imagesize=end-current; 83 84 GLubyte *imagedata = new GLubyte[imagesize]; 85 86 fread(imagedata,sizeof(GLubyte),imagesize,fa); 87//ReadDDS 終わり 88// GLuint ID; 89//glGenTextures (1,&ID); 90 91//glBindTexture (GL_TEXTURE_2D,ID); //コメントアウトはmain側に書いている 92 93glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 94 95 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); 96 97 glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); 98 99//DXT3解凍作業 100 int offset=0; 101 102 103 104 GLsizei mWidth=ddsd.width; 105 106 GLsizei mHeight=ddsd.height; 107 108 GLsizei mSize=0; 109 110 int blockSize=16; 111 112 for(int i=0; i<(int)ddsd.mipMapLevels;i++) 113 { 114 mSize=((mWidth+3)/4)*((mHeight+3)/4)*blockSize; 115 116 glCompressedTexImage2D(GL_TEXTURE_2D,i,format,mWidth,mHeight,0,mSize,offset+imagedata); 117 118 if(mWidth>>1){mWidth=(mWidth>>1);} 119 120 else {mWidth=1;} 121 122 if(mHeight>>1){mHeight=(mHeight>>1);} 123 124 else {mHeight=1;} 125 126 offset +=mSize; 127 }//解凍作業終わり 128 fclose(fa); 129 130 delete [] imagedata; 131 132 imagedata=NULL; 133 134}

ただコピーしたのですが上手くいきませんでした。画像はちらつきました。

インデントはpcに任せました。
間違えてる箇所を教えてください。
引用サイト https://w.atwiki.jp/opengl/pages/59.htmlを新たに見ました。
最終更新:2015年01月03日 22:04だそうです。

追記 printf を削除しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2020/09/06 09:01

参照しているページに「Microsoft Visual Studio 2005 Professional Editionを用いています」と書かれていますが、15年前のソフトが今でも正常に機能するのですか?
txty

2020/09/06 09:46 編集

すいません。気がつきませんでした。Microsoft VisualStudio 2005 Professional Editionは使ってないのですが描画はでき、反映するので一応意見もらってしばらくしたら、ソースコードごと消します。正常に機能するのかはわかりません。とりあえず、描画結果は上と大体同じになります。後netに記載されているcurrがよくわかりませんでした。あと、ファイルはwidth=256 height=256 DXT3のものを使用してますがDXT3は影響あるのでしょうか。
txty

2020/09/06 12:41

解凍作業してませんでした。
txty

2020/09/11 18:29 編集

ループのnumMipmapsnumMipmaps 取得できた。構造体の構造体いれてるのがよくわからないけど freadにそのままsizeof(構造体),1か。
txty

2020/09/11 11:29 編集

いちおうアプリケーションインストーラーででてくるエディタ使っています。(実際に使われてるとかは知らないです)。ファイルは圧縮されてました。なんかー評価ついてすいません。質問に関して言うと結構困ってはいます。
txty

2020/09/12 06:55

三角形1つのポリゴンに、最初から丸々コピーしたのにうまくいかない。(最初からうまくいかないやつなのかな。)
guest

回答1

0

ベストアンサー

FILE *fa=fopen(filename,"r");

DDSファイルはバイナリなのでrbで開きましょう。

fseek(fa, 0L, SEEK_END);
unsigned long end= ftell(fa);
unsigned long imagesize=end-current;

GLubyte *imagedata = new GLubyte[imagesize];
fread(imagedata,sizeof(GLubyte),imagesize,fa);

参考サイトにはfseekでファイルの最後に行ったあと、
fseek(fp, curr, SEEK_SET)で戻る処理がありましたが、それが抜けています。
freadの戻り値をチェックしていれば気づけたはずです。

参考サイトではddsd.format.fourCCでフォーマットを判別していますが、
fourCCが有効かどうかはddsd.flagsを判別する必要があります。
ddsd.mipMapLevelsも同様です。

ちなみに、手元のDirectX SDKにあったTiny_skin.ddsはddsd.format.fourCCは0で、
そもそも圧縮されていませんでした。また、ddsd.mipMapLevelsも0だったので
ミップマップ用の画像データも入っていないと思います。

Tiny_skin.ddsでしか確認していませんが、圧縮されていない画像データの場合は
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ddsd.width, ddsd.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imagedata);
でいけました。

無理やり修正すると下記のようになるでしょうか。

cpp

1 FILE* fa = fopen(filename, "rb"); // rbに修正 2 3 ... 4 5 fseek(fa, 0L, SEEK_END); 6 unsigned long end = ftell(fa); 7 fseek(fa, current, SEEK_SET); // 元の位置に戻す 8 unsigned long imagesize = end - current; 9 10 GLubyte* imagedata = new GLubyte[imagesize]; 11 fread(imagedata, sizeof(GLubyte), imagesize, fa); 12 13 //ReadDDS 終わり 14 // GLuint ID; 15 //glGenTextures (1,&ID); 16 17 //glBindTexture (GL_TEXTURE_2D,ID); //コメントアウトはmain側に書いている 18 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 19 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 20 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 21 22 if (ddsd.format.fourCC == 0) // 圧縮されていない場合 23 { 24 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 25 26 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ddsd.width, ddsd.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imagedata); 27 fclose(fa); 28 delete[] imagedata; 29 return; 30 }

投稿2020/09/12 14:13

編集2020/09/12 14:29
mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

txty

2020/09/14 03:41 編集

無事に修正できそうです。有り難うございます。 昨日ソースコードをいじってしまい、とりあえず圧縮した方は、fseek(fp, curr, SEEK_SET)を入れることでうまくテキスチャが張られるのを確認できました。 圧縮なしの方は、圧縮なしの方には流れないみたいでしたが、そのまま実装しました。テクスチャは出てるのでやりたいことはできています。本当に有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問