アプリ版:「スタンプのみでお礼する」機能のリリースについて

m_pDevice->CreateTexture( 128, 128, 1, 0, D3DFMT_A32B32G32R32F,
D3DPOOL_MANAGED, &pTex, NULL );

で生成したテクスチャに浮動小数点の値を
自分で書き込みたいのですが、うまくいきません。

テクスチャのサーフェスをロックしたあと、操作できるようですが・・
ソースコードを記述します。

D3DLOCKED_RECTrect;
LPDWORD data;
float a = 0.0;
float r = 0.56;
float g = 0.24;
float b = 1.0;

/* テクスチャのサーフェスをロック */
surface->LockRect(&rect, NULL, 0);

for(int y=128-1; y>=0; y--){

/* 書き込む行の先頭アドレスに移動する */
data = (LPDWORD)((LPBYTE)rect.pBits + rect.Pitch * y);

for( int x=0; x<128; x++){

/* カラーデータを書き込む */
*data = ((DWORD)a << 96) | ((DWORD)b << 64) |
((DWORD)g << 32) | ((DWORD)r );
    data++;
}
}

スペースで余白を空けることができなくて、少々見にくくなってしまいました。

1つの色につき32bitななので、32bitづつシフトしています。
また、float型は4バイト(32bit)なので間違ってはいないと思うのですが・・。

何かアドバイスできる方はお願い致します。

A 回答 (2件)

>生成したテクスチャに浮動小数点の値を書き込みたい


書き込みたいのか浮動小数点をカラーに使いたいのかどちらですか?
プログラムは後者のようですが。。。

>うまくいきません。
質問者さんに限ることではありませんが、質問する人が、
どのような結果を期待して、どのような結果になったのかを
提示してもらわなければアドバイスのしようがありません。

>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)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

いろいろ調査したところ・・
data = (LPDWORD)((LPBYTE)rect.pBits + rect.Pitch * y);
の部分の(LPDWORD)を(float*)にしたら解決しました。

>質問者さんに限ることではありませんが、質問する人が、
>どのような結果を期待して、どのような結果になったのかを
>提示してもらわなければアドバイスのしようがありません。
確かにその通りですね。
次回からはもう少し具体的に投稿しようと思います。

わざわざソースを載せていただきありがとうございます。
aris-wizの書いていただいたものも1つの参考になりました。

お礼日時:2007/12/07 11:26

ちなみに、わたしは16Bitの書き込みでやってたので、


unsigned short *p = pBits;とかになってるので、
その辺りは、適当に読み替えてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
いろいろ調べてみたところ、

data = (LPDWORD)((LPBYTE)rect.pBits + rect.Pitch * y);
の(LPDWORD)の部分を(float*)に直したら解決しました。

aris-wizの事例も1つの参考になりました。

お礼日時:2007/12/07 11:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!