#1 Members - Reputation: 146
Posted 20 June 2012 - 12:08 PM
I'm having some basic problems with Direct3D9 and I'm hoping somebody can point me in the right direction. I have succeeded in using Direct3D in the past, but I had separate vertex buffers for each primitive. I would then fill the vertex buffer, then call a DrawPrimitive a single time. It all worked fine.
Now I have the following sequence:
1) Create a vertex buffer
2) Add one triangle to the buffer. At this point, I call
Lock(0,0,&bfr,D3DLOCK_DISCARD)
copy triangle vertex data into bfr, starting at bfr[0]
3) Add second triangle to the buffer. Here I assume I do not need to call Lock again as I have bfr saved. I simply copy the triangle vertex into bfr, starting at bfr[3] ("3" means I have the stride into consideration).
4) Now I'm going to draw. I do
BeginScene
SetFVF
SetStreamSource(0,VB,0,size);
DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
5) Now the second triangle. Since BeginScene and SetFVF have already been called I now call
SetStreamSource(0,VB,0,size); (again)
DrawPrimitive(D3DPT_TRIANGLELIST,3,1);
6) Finally, I do
EndScene
Present
The image I get is completely wrong. So my questions:
(a) Is there a way to debug Direct3D9 so I can actually see what it's trying to do and why it displayed the image it did?
(b) Am I doing something obviously wrong above?
© I will keep the vertex buffer for a while as I rotate the model. This means that the drawing part gets repeated many times, while copying the data to the buffer is done once only. Once I'm done with viewing this I will Release the vertex buffer altogether. In other words, I will write to the "bfr" pointer many times, while Lock has been called only once. Am I using the right options in the functions above?
(d) I tried using the DirectX Control Panel where I choose to use the Debug version of Direct3D. Should I expect to see any output anywhere in Visual Studio - or anywhere else, for that matter?
Thanks.
#2 Members - Reputation: 4032
Posted 20 June 2012 - 12:21 PM
Aside from that, SetStreamSource is only necessary once here, and if you don't change any states you can draw both triangles in a single call.
It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.
#3 Members - Reputation: 146
Posted 20 June 2012 - 12:30 PM
You're right: I forgot to mention that I'm calling Unlock right before the call to BeginScene. Sorry about that...
I know I can draw both triangles in a single call - in theory. In practice, I don't really know how the application is going to send graphics calls to me. In reality, I'm drawing around 0.5 million triangles - not one at a time, but in groups. Or triangle strips, or lines, or points, etc. I used 2 triangles in the example for simplicity, but it could really be anything.
Any thoughts on how I can debug this?
Thanks.
#4 Members - Reputation: 4032
Posted 20 June 2012 - 01:10 PM
Lock
Copy data in
Unlock
SetStreamSource
DrawPrimitive
It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.
#5 Members - Reputation: 146
Posted 20 June 2012 - 02:05 PM
Thanks. I've corrected that. But my problem didn't go away. I finally figured it out... in the new code I mistakenly used D3DFVF_XYZRHW rather than D3DFVF_XYZ. That's what happens when you use "cut and paste" to generate new code :-(!!!
I still wish there were a way to debug Direct3D9 so I would see this was happening.
Thanks again!
#6 Members - Reputation: 4032
Posted 20 June 2012 - 02:55 PM
It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.






