c++ - Strange lighting effect in direct3d switches dark and light -
i drawing d3dpt_pointlist
, have set direct3d 9 device number of states. don't want use lighting, because want show vertex colors.
depending on view matrix, vertices appear become dark or light. change @ once , can't find renderstate solves problem.
i'll try keep short possible. if there info missing, please let me know.
struct myvertex { float x, y, z; d3dcolor color; }; // in initialization of device g_d3d9device->createvertexbuffer (sizeof(myvertex)*g_maxverts, d3dusage_writeonly | d3dusage_dynamic, 0, d3dpool_default, &g_d3d9dynamicvb, null);
each frame set these render states:
g_d3d9device->setrenderstate (d3drs_cullmode, d3dcull_none); g_d3d9device->setrenderstate (d3drs_alphablendenable, false); g_d3d9device->setrenderstate (d3drs_zfunc, d3dcmp_lessequal); g_d3d9device->setrenderstate (d3drs_zwriteenable, true); g_d3d9device->setrenderstate (d3drs_zenable, true); g_d3d9device->setrenderstate(d3drs_localviewer, false); g_d3d9device->setrenderstate (d3drs_lighting, false); g_d3d9device->setrenderstate (d3drs_colorvertex, false); float size = g_pcmanager.getpointsize(); g_d3d9device->setrenderstate (d3drs_pointsize, *((dword*)&size)); g_d3d9device->setfvf (d3dfvf_xyz|d3dfvf_diffuse); // , render void* vbptr;// = new char[m_vertsbuff0.size() * sizeof(myvertex)]; uint maxverts = std::min(m_vertsbuff0.size(),(uint)g_maxverts); if(succeeded(vertexbuffer->lock (0, 0, &vbptr, d3dlock_discard))) { memcpy (vbptr, m_vertsbuff0.data(), sizeof(myvertex) * maxverts); vertexbuffer->unlock (); //without setting streamsource, d3d9 take (undefined) memory read/draw device->setstreamsource (0, vertexbuffer, 0, sizeof(m_vertsbuff0[0])); // draw! device->drawprimitive (d3dpt_pointlist, 0, maxverts); }
i note unity3d native c++ plugin, maybe there glitches i'm not aware of.
this looks different angles:
i needed add texture stages before drawing object.
device->settexturestagestate (0, d3dtss_colorop, d3dtop_selectarg1); device->settexturestagestate (0, d3dtss_colorarg1, d3dta_current); device->settexturestagestate (0, d3dtss_alphaop, d3dtop_selectarg1); device->settexturestagestate (0, d3dtss_alphaarg1, d3dta_current); device->settexturestagestate (1, d3dtss_colorop, d3dtop_disable); device->settexturestagestate (1, d3dtss_alphaop, d3dtop_disable);
Comments
Post a Comment