• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DirectX ~テクスチャに値を書き込む~)

DirectXテクスチャへの値の書き込み方法

このQ&Aのポイント
  • DirectXを使用してテクスチャに値を書き込む方法について説明します。
  • テクスチャのサーフェスをロックして浮動小数点の値を書き込む方法について詳しく解説します。
  • カラーデータを32ビットずつシフトしながらテクスチャに書き込む方法について説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

>生成したテクスチャに浮動小数点の値を書き込みたい 書き込みたいのか浮動小数点をカラーに使いたいのかどちらですか? プログラムは後者のようですが。。。 >うまくいきません。 質問者さんに限ることではありませんが、質問する人が、 どのような結果を期待して、どのような結果になったのかを 提示してもらわなければアドバイスのしようがありません。 >for( int x=0; x<128; x++) このループの意味はおわかりですか? dataは書き込む先頭ですよね? 先頭のアドレスから128回しか書き込んでないようですが、 直線がちょこっとでるだけのような。。。 私が昔書いたものですが、 RECT Rect; D3DLOCKED_RECT LockRect; m_Textuer->LockRect(0, &LockRect, &Rect, 0); for ( int y = Rect.top; y < Rect.bottom; y++ ) {  unsigned short *p = pBits;  pBits += LockRect.Pitch / sizeof(short);  for ( int x = Rect.left; x < Rect.right; x++ )  {   *p++ = usColor;  } } m_Textuer->UnlockRect(0); こんなかんじ:-p)

cain_sep
質問者

お礼

ご回答ありがとうございます。 いろいろ調査したところ・・ data = (LPDWORD)((LPBYTE)rect.pBits + rect.Pitch * y); の部分の(LPDWORD)を(float*)にしたら解決しました。 >質問者さんに限ることではありませんが、質問する人が、 >どのような結果を期待して、どのような結果になったのかを >提示してもらわなければアドバイスのしようがありません。 確かにその通りですね。 次回からはもう少し具体的に投稿しようと思います。 わざわざソースを載せていただきありがとうございます。 aris-wizの書いていただいたものも1つの参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

ちなみに、わたしは16Bitの書き込みでやってたので、 unsigned short *p = pBits;とかになってるので、 その辺りは、適当に読み替えてください。

cain_sep
質問者

お礼

ご回答ありがとうございます。 いろいろ調べてみたところ、 data = (LPDWORD)((LPBYTE)rect.pBits + rect.Pitch * y); の(LPDWORD)の部分を(float*)に直したら解決しました。 aris-wizの事例も1つの参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テクスチャがうまく表示されない[DirectX]

    こんにちわ。初歩的な質問かもしれませんが、よろしくお願いします。 テクスチャは読み込まれてはいるのですが、(色だけは表示される。違う画像にすると色が変わる)どうも模様が表示されず、画像どおりになりません。 とりあえず関係ありそうなコードだけ。。 -----頂点定義-------- struct CUSTOMVERTEX {FLOAT X,Y,Z; D3DVECTOR NORMAL; FLOAT U,V;}; #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) ----頂点------ struct CUSTOMVERTEX t_vert[]={ {0.0f, 0.0f,0.0f,0,1,0, 0.0f, 0.0f,}, {-30.0f,0.0f,0.0f,0,1,0, 1.0f, 0.0f,}, {0.0f, 0.0f,30.0f,0,1,0, 0.0f, 1.0f,}, {-30.0f,0.0f,30.0f,0,1,0, 1.0f, 1.0f,}, }; -------描画処理------ d3ddev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX)); d3ddev->SetTexture( 0 , texture ); d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); ------------------------------------------------------------- テクスチャのサイズは512x512px、ライトはD3DRS_LIGHTNINGでTRUEにしてもFALSEにしても変化なし。 環境は以下のとおりです。 OS: WindowsXP コンパイラ:VisualStudio2005 DirectX9.0

  • DirectX9でのテクスチャフォーマットについて

    いつもお世話になります。 VC6.0&WIN2000、DirectX9.0でプログラムを作っています。 D3DXCreateTextureFromFileInMemoryEx関数でテクスチャを読み込んだあと、テクスチャのメンバ関数のGetLevelDescを行ってみました。 すると、フォーマットの返り値が必ず D3DFMT_A8R8G8B8 になります。 D3DXCreateTextureFromFileInMemoryEx関数で指定したフォーマットと違うのですが、これは何故でしょうか? また上記のせいか、元々の画像ファイルのサイズよりも、多くのメモリを使用しています。 おそらく、1ピクセルを D3DFMT_A8R8G8B8 の大きさでメモリを確保してしまうからだと思うのですが、本来の画像フォーマットの大きさで確保する方法はないでしょうか? それでは、どうぞ宜しくお願いします。

  • DirectXで画像表示

    DirextXでゲームを作ってるんですがわからないことがあるんで教えてください。 背景として640×640(ピクセル)の画像を表示したくて(ウィンドウはサイズ640,640で作成) RECT from; D3DXVECTOR3 to; D3DCOLOR color; from = makeRect(0,0,640,640); to = D3DXVECTOR3(0,0,0); color = D3DCOLOR_ARGB(255,255,255,255); if(g_pTexture != NULL) g_pSprite->Draw(g_pTexture, &from, NULL, &to, color); RECT makeRect(int x, int y, int w, int h) { RECT box; box.left = x; box.top = y; box.right = w; box.bottom = h; return (box); } //g_pTexture = D3DXCreateTextureFromFileEx関数で作成したテクスチャオブジェクト。 //g_pSprite = スプライトオブジェクト。 大体こんな感じの流れで背景画像を表示したらウィンドウ全体に画像の一部分だけが拡大されて表示されました。なぜ画像全体がうまく表示されないんでしょうか? 例えば64×64のキャラクタ画像を from = makeRect(0,0,64,64); to = D3DXVECTOR3(0,0,0); で表示したら画面左上にうまく表示されました。 初心者なんであまりうまく説明できないんでかなりわかりにくいかもしれませんが、わかる方よろしくお願いします。

  • テクスチャに半透明ポリゴンを描画すると透ける??

    DirectX9で不透明なテクスチャに半透明ポリゴンを描画すると、ポリゴンを描画した部分が透けてしまうのはなぜですか? 1.「D3DUSAGE_RENDERTARGET」指定したテクスチャを作成して白でクリア 2.そのテクスチャに半透明の青いポリゴンをDrawPrimitiveUPで描画 3.そのテクスチャをD3DXSaveTextureToFileでPNG等で保存 とした場合、私のイメージでは白地に薄い青の四角が描かれた不透明な画像ファイルができると思ったんですが、青の部分が半透明になりました。 なぜ不透明なテクスチャに半透明ポリゴンを描くと半透明になるのでしょうか・・・? ―――――――――――――――――――――――――――――――――――― //レンダリング用テクスチャの準備 { global.pDevice->CreateTexture( 512, 512, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTarget, NULL); pTarget->GetSurfaceLevel(0, &pSurface); global.pDevice->GetRenderTarget(0, &pBackBuffer); //バックバッファの取得 global.pDevice->SetRenderTarget(0, pSurface); //ターゲットの切り替え //白(不透明)にクリア global.pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 255, 255, 255), 1.0f, 0 ); } //テクスチャに半透明ポリゴンを描画 { VERTEX point[4] ={ D3DXVECTOR3(100, 200, 1), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(100, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(200, 200, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(200, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255) }; global.pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE); global.pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, point, sizeof(VERTEX)); global.pDevice->SetRenderTarget(0, pBackBuffer); //レンダリングターゲット戻す } //テクスチャを保存 { D3DXSaveTextureToFile("d:\\hoge.png", D3DXIFF_PNG, pTarget, NULL); } ―――――――――――――――――――――――――――――――― D3DTSS_ALPHAOPをADDにしてみたりしたのですが、変化がありません。 テクスチャが透ける理屈と、こうならないようにする手段(アルファ値は加算したい)を教えてもらえると助かります。

  • Openglでテクスチャを透明にする方法について

    Microsoft Visual C++ 2008 Express Edition を使ってtgaファイルをテクスチャとして取り込んで表示するプログラムを作っております. Openglのスポットライト機能を使ってテクスチャを照らしたいと考えています. しかし,どこかのプログラミングがおかしいのか,テクスチャの張り付けに指定された座標4点付近にライトが当たったときでないとテクスチャが光りません. 方法がわからなかったので,テクスチャを大きな球体の内部に配置し,球体の内部からスポットライトでテクスチャ方向を照らすようにしました. 添付した図の左下にスポットライトが白っぽく見えているのは,この大きな球体の内部を照らした光となっています. このように球体内部がスポットライトで照ったので,後はテクスチャさえ透明にすることができれば,間接的にテクスチャをスポットライトで照らしているような感じで見えるのではないかと考えています. しかし肝心のテクスチャを透明にする方法が全くわかりません.(´・ω・) アルファ値というのを使ったり,ブレンド?を使ったりしたらできるのでは,と思ったのですが,どこにどうプログラムしたらいいのかの具体的な説明がなかったので,わかりませんでした(´・ω・) テクスチャを透かして,奥の大きな球体内部を照らすことができれば,その明るさで半透明の手前のテクスチャもうっすら光るのではないかと考えています. わかる方,教えてください. 本当に困ってます;w; 今のプログラム内部のテクスチャの部分は以下に書きます. よろしくお願いします><; void initTexture(void) { FILE *fp; int x, z; /* texture file open */ if((fp=fopen("ougonzan.tga", "rb"))==NULL){ fprintf(stderr, "texture file cannot open\n"); return; } fseek(fp, 18, SEEK_SET); for(x=0; x<TEX_HEIGHT; x++){ for(z=0; z<TEX_WIDTH; z++){ image[x][z][2]=fgetc(fp);/* B */ image[x][z][1]=fgetc(fp);/* G */ image[x][z][0]=fgetc(fp);/* R */ image[x][z][3]=fgetc(fp);/* alpha */ } } fclose(fp); } void displayTexPolygon(void) { glEnable(GL_TEXTURE_2D); glBegin(GL_TRIANGLE_FAN); glTexCoord2f(0.0, 0.0); glVertex3f(-16.0,-12.0, 5.0); //左下 glTexCoord2f(0.0, 1.0); glVertex3f(-16.0, 12.0, 5.0); //左上 glTexCoord2f(1.0, 1.0); glVertex3f( 16.0, 12.0, 5.0); //右上 glTexCoord2f(1.0, 0.0); glVertex3f( 16.0,-12.0, 5.0); //右下 glEnd(); glDisable(GL_TEXTURE_2D); } void display(void) { static const float floor_Color[] = { 1.0, 1.0, 1.0, 1.0 }; static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 }; static GLfloat yellow[] = { 0.8, 0.8, 0.2, 0.0 }; static GLfloat white[] = { 1.0, 1.0, 1.0, 0.0 }; static float spin=0.0; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //gluLookAt( 視点の位置x,y,z, 視界の中心位置の参照点座標x,y,z, 視界の上方向のベクトルx,y,z); gluLookAt( 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0); // 内側から //集中型スポットライト //glLightfv(光源番号, パラメータ, パラメータの値); glLightfv(GL_LIGHT0, GL_POSITION, SpotLight.pos); //光源の位置[pos] glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, SpotLight.spotDir); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, SpotLight.spotCutoff); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, SpotLight.spotExp); //巨大な球体 glPushMatrix(); glTranslated(0.0, 0.0, 7); glMaterialfv(GL_FRONT, GL_DIFFUSE, white); glutSolidSphere(60, 10000, 10000); glPopMatrix(); glPushMatrix(); glPopMatrix(); glPushMatrix(); glClearColor(0.0, 0.0, 1.0, 0.5); glTranslatef(0.0, 0.0, 45.0); //テクスチャの位置設定 // glRotatef(spin, 0.0, 1.0, 0.0); //テクスチャの回転 glColor4f(1.0, 0.0, 0.0, 0.0); //テクスチャの色設定 displayTexPolygon(); } spin+=1.0; glPopMatrix(); glFlush(); glutSwapBuffers(); }

  • 円周率 πの値

    円周率πの値を求めたのですがNを大きくすると3.1415・・・に近づくはずですが、うまくいきません。どうすればいいのか検討がつきませんので、ご指摘お願いします。 float myrand() { float ans; ans=(float)rand()/(RAND_MAX); return(ans); } main() { int i,sum; long N; float ans,x,y,r,p; srand((unsigned)time(NULL)); sum=0; for(N=10;N<=1000000;N*=10){ for(i=10;i<N;i++){ x=myrand(); y=myrand(); r=x*x+y*y; if(r<=1){ sum++; } } ans=(float)(sum)/N; p=ans*4; printf("%d %f\n",N,p); } getch(); exit(0); } 実行結果 10 0.000000 100 2.640000 1000 3.440000 10000 3.483600 100000 3.490640 1000000 3.491268

  • DirectXでの半透明PNG画像について

    半分が半透明で、もう半分は透明でない単色のPNG画像(128×128サイズ)を作成しました。 ソフトはAdobe Photoshop Elements 6.0で、アルファ設定されている「PNG-24」です。 D3DXCreateTextureFromFileEx関数で、そのPNG画像を読み込んで描画したのですが、半透明の部分は描画されず、透明にしていない片方しか描画されませんでした。 半透明の部分も描画されるようにするにはどうすればよいでしょうか? 自分でもいろいろ調べてみたのですが、原因がよく分からないので質問させていただきます。 一応、参考程度に… // スプライトオブジェクトの作成 if ( FAILED( D3DXCreateSprite( g_pd3dDevice, &m_pSprite ) ) ) {     // エラー処理 } D3DXIMAGE_INFO info; // テクスチャの読み込み if( FAILED( D3DXCreateTextureFromFileExA( g_pd3dDevice,                                FileName,                                D3DX_DEFAULT,                                D3DX_DEFAULT,                                D3DX_DEFAULT,                                0,                                D3DFMT_A1R5G5B5,                                D3DPOOL_MANAGED,                                D3DX_FILTER_NONE,                                D3DX_FILTER_NONE,                                0,                                &info,                                NULL,                                &g_pd3dTexture) ) ) {     // エラー処理 }

  • DirectXのD3DXVECTOR3

    directxでのCDに書いてあるこのソースの一部の事で質問します。 D3DXVECTOR3 mVecDir; mVecDir = D3DXVECTOR3( -0.5f, -0.5f, 1.0f); --------------------------------------------------------------- D3DXVECTOR3をDirectX SDK October 2004で調べたのですが、 typedef struct D3DXVECTOR3 : public D3DVECTOR { public: D3DXVECTOR3() {}; D3DXVECTOR3( CONST FLOAT * ); D3DXVECTOR3( CONST D3DVECTOR& ); D3DXVECTOR3( CONST D3DXFLOAT16 * ); D3DXVECTOR3( FLOAT x, FLOAT y, FLOAT z ); // 型変換 operator FLOAT* (); operator CONST FLOAT* () const; // 代入演算子 D3DXVECTOR3& operator += ( CONST D3DXVECTOR3& ); D3DXVECTOR3& operator -= ( CONST D3DXVECTOR3& ); D3DXVECTOR3& operator *= ( FLOAT ); D3DXVECTOR3& operator /= ( FLOAT ); // 単項演算子 D3DXVECTOR3 operator + () const; D3DXVECTOR3 operator - () const; // 2 項演算子 D3DXVECTOR3 operator + ( CONST D3DXVECTOR3& ) const; D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const; D3DXVECTOR3 operator * ( FLOAT ) const; D3DXVECTOR3 operator / ( FLOAT ) const; friend D3DXVECTOR3 operator * ( FLOAT, CONST struct D3DXVECTOR3& ); BOOL operator == ( CONST D3DXVECTOR3& ) const; BOOL operator != ( CONST D3DXVECTOR3& ) const; } D3DXVECTOR3, *LPD3DXVECTOR3; これを自分が見た限り、戻り値がないと思います。 何故、mVecDir = D3DXVECTOR3( -0.5f, -0.5f, 1.0f);のD3DXVECTOR3は戻り値があるのでしょうか? ちなみに、質問のソース2行はD3DXVECTOR3 mVecDir( -0.5f, -0.5f, 1.0f);でもOKですよね? よろしくお願いします。

  • プログラミングProcessing ピンポンゲーム

    Processingでピンポンゲームを作っています。作成したプログラムは void setup(){ size(400,300); } float x=10; float y=10; float dx=1; float dy=2; int count=0; float r_w=50.0; float a_w=15.0; float a_h=15.0; boolean checkHit(float x,float y){ if(y+a_h<250)return false; if(x+a_w>=mouseX&&x<=mouseX+r_w){ return true; }else{ return false; } } void draw(){ x=x+dx;y=y+dy; if(x+a_w>=400){ dx=-1; }else if(x<0){ dx=1; } if(y+a_w>300){ x=0; y=0; dx=1; dy=2; count=0; }else if(y<0){ dy=2; } background(0,0,128); rect(x,y,a_w,a_w); rect(mouseX,250,r_w,3); text(count,10,300); if(checkHit(x,y)){ dy=-2; count=count+1; } } このプログラムだとどうしてもラケットの下にボールが潜り込んだ時に ボールが跳ね返されてしまうバグが発生してしまいます。 問題はboolean checkHitの部分にあると思うのですが、 どのように調節すればよいか分かりません。 わかる方教えてください<(__)>

  • Mutexの次の使い方で

    typedef struct{ HWND hwnd;BOOL th_end;HANDLE hmutex; } DATA, *PDATA; /////////////////////////////////////// static HANDLE hThread1,hThread2; DWORD threadID1,threadID2; static DATA data; static HANDLE hMutex; switch (msg) { case WM_CREATE: //hMutex= //CreateMutex(NULL,FALSE,NULL); data.hwnd = hWnd; data.th_end = FALSE; data.hmutex = hMutex; hThread1=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)Thread1, (LPVOID)&data, 0,(LPDWORD)&threadID1); hThread2=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)Thread2, (LPVOID)&data, 0,(LPDWORD)&threadID2); /*x*/hMutex= /*x*/CreateMutex(NULL,FALSE,NULL); break; とするのは正しくて/*x*/の行を削除して//をとり hMutexの位置を前に持ってくるのは間違っているのでしょうか?