我正在使用DirectX的图形引擎。我简化像这样我的FUNC之一(因为它有同样的问题):VS 2010 C++局部变量调试
void foo(int p,int q){
if(!p){
int a=0;
a=4;
}else{
int a=0;
a=5;
}
if(p==1){
if(q==1){
float opacity=0;
}
}
}
int main(){
foo(1,2);
return 0;
}
如果我调用foo(1,2),我不能查看的值else块在VS调试面板,但是当我打foo(0,2)我可以看到一个if块的值。它显示Symbol'a'没有找到bla bla ...而当我改变“float opacity = 0;”时“浮动不透明”;它运作良好,我可以调试它。
我根据自己的properties.Here分组的对象,网格和材料是我原来的功能:
VOID DXACMyApp::LoadSceneFromFile(CHAR *a_file){
//File name can not be null
DXAMIsNull(a_file,DXAE_ERROR_REPORTING_LEVEL_MBOX);
DXAMIsNull(m_effect,DXAE_ERROR_REPORTING_LEVEL_MBOX);
//Create Supported Input Layouts
//1st input layout
//elements
D3D11_INPUT_ELEMENT_DESC ied_PN[] = {
{"POSITION", 0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},
{"NORMAL", 0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0}
};
//every pass of same technique must have same layout
//create input layout
IDXACRenderGroupIL *ilGroup_PN = 0;
DXAMHResult(CreateILGroup(m_effect->GetTechniqueByName("SolidMaterialRender"),ied_PN,2,&ilGroup_PN),DXAE_ERROR_REPORTING_LEVEL_MBOX);
AddInputLayoutGroup(ilGroup_PN);
//create technique groups
IDXACRenderGroupTechnique *SolidMaterialTechGroup = 0;
DXAMHResult(CreateTechniqueGroup(m_effect->GetTechniqueByName("SolidMaterialRender"),&SolidMaterialTechGroup),DXAE_ERROR_REPORTING_LEVEL_MBOX);
//add tech group to il group
ilGroup_PN->AddTechniqueGroup(SolidMaterialTechGroup);
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(a_file,aiProcess_CalcTangentSpace|aiProcess_Triangulate|aiProcess_OptimizeMeshes|
aiProcess_JoinIdenticalVertices|aiProcess_SortByPType|aiProcess_RemoveRedundantMaterials);
//iterate objects
for(UINT i=0 ; i<scene->mRootNode->mNumChildren ; i++){
aiNode *object = scene->mRootNode->mChildren[i];
D3DXMATRIX worldMatrix = ToD3DXMATRIX(object->mTransformation);
//object's mesh vector
std::vector<IDXACMesh*> meshes;
//count known mesh types
UINT recognizedMeshCount = 0;
//iterate object's meshes(materials)
for(UINT j=0 ; j<object->mNumMeshes ; j++){
aiMesh *mesh = scene->mMeshes[ object->mMeshes[j] ];
//Test material type
aiMaterial *material = scene->mMaterials[mesh->mMaterialIndex];
BOOL recognized = false;
IDXACMaterial *newMaterial = 0;
if(material->mNumProperties == 8){
//materials with 8 properties
if(strcmp(material->mProperties[0]->mKey.data,"?mat.name")==0 &&
strcmp(material->mProperties[1]->mKey.data,"$clr.ambient")==0 &&
strcmp(material->mProperties[2]->mKey.data,"$clr.diffuse")==0 &&
strcmp(material->mProperties[3]->mKey.data,"$clr.specular")==0 &&
strcmp(material->mProperties[4]->mKey.data,"$clr.emissive")==0 &&
strcmp(material->mProperties[5]->mKey.data,"$mat.opacity")==0 &&
strcmp(material->mProperties[6]->mKey.data,"$mat.bumpscaling")==0 &&
strcmp(material->mProperties[7]->mKey.data,"$mat.shadingm")==0 ){
FLOAT opacity,specPower;
D3DXCOLOR diffuse;
D3DXCOLOR specular,ambient,emissive;
//get material info
specPower = 1.0f;
memcpy(&ambient ,material->mProperties[1]->mData,12);
memcpy(&diffuse ,material->mProperties[2]->mData,12);
memcpy(&specular,material->mProperties[3]->mData,12);
memcpy(&emissive,material->mProperties[4]->mData,12);
memcpy(&opacity ,material->mProperties[5]->mData,4);
diffuse.a = ambient.a = specular.a = emissive.a = opacity;
//create material interface
std::string matName(material->mProperties[0]->mData,17);
DXACMaterialT1 *matInstance = 0;
matInstance = new DXACMaterialT1(material->mProperties[0]->mData,&diffuse,&specular,&ambient,&emissive,specPower,m_effect);
newMaterial = matInstance;
recognized = true;
recognizedMeshCount++;
}
}else if(material->mNumProperties == 10){
if(strcmp(material->mProperties[0]->mKey.data,"?mat.name")==0 &&
strcmp(material->mProperties[1]->mKey.data,"$clr.ambient")==0 &&
strcmp(material->mProperties[2]->mKey.data,"$clr.diffuse")==0 &&
strcmp(material->mProperties[3]->mKey.data,"$clr.specular")==0 &&
strcmp(material->mProperties[4]->mKey.data,"$clr.emissive")==0 &&
strcmp(material->mProperties[5]->mKey.data,"$mat.shininess")==0 &&
strcmp(material->mProperties[6]->mKey.data,"$mat.shinpercent")==0 &&
strcmp(material->mProperties[7]->mKey.data,"$mat.opacity")==0 &&
strcmp(material->mProperties[8]->mKey.data,"$mat.bumpscaling")==0 &&
strcmp(material->mProperties[9]->mKey.data,"$mat.shadingm")==0 ){
D3DXCOLOR diffuse;
D3DXCOLOR specular,ambient,emissive;
FLOAT opacity,specPower;
memcpy(&ambient ,material->mProperties[1]->mData,12);
memcpy(&diffuse ,material->mProperties[2]->mData,12);
memcpy(&specular,material->mProperties[3]->mData,12);
memcpy(&emissive,material->mProperties[4]->mData,12);
memcpy(&specPower ,material->mProperties[5]->mData,4);
memcpy(&opacity ,material->mProperties[7]->mData,4);
diffuse.a = ambient.a = specular.a = emissive.a = opacity;
std::string matName(material->mProperties[0]->mData,17);
DXACMaterialT1 *matInstance = new DXACMaterialT1(matName.substr(4,matName.npos).c_str(),&diffuse,&specular,&ambient,&emissive,specPower,m_effect);
newMaterial = matInstance;
recognized = true;
recognizedMeshCount++;
}
}
if(recognized){
//create mesh instance
DXACMeshT1 *newMesh = new DXACMeshT1(m_d3dDeviceContext);
//fill vertex buffer desc
D3D11_BUFFER_DESC vbd;
vbd.ByteWidth = mesh->mNumVertices*sizeof(VERTEXT1);
vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
vbd.StructureByteStride = 0;
vbd.Usage = D3D11_USAGE_IMMUTABLE;
//create vertex buffer memory block and subres. data
VERTEXT1 *vbMemBlock = new VERTEXT1[mesh->mNumVertices];
for(UINT i=0; i<mesh->mNumVertices ; i++){
vbMemBlock[i] = VERTEXT1(mesh->mVertices[i],mesh->mNormals[i]);
}
D3D11_SUBRESOURCE_DATA vbSrd;
vbSrd.pSysMem = vbMemBlock;
DXAMHResult(m_d3dDevice->CreateBuffer(&vbd,&vbSrd,&newMesh->m_vertexBuffer),DXAE_ERROR_REPORTING_LEVEL_MBOX);
newMesh->m_vertexCount = mesh->mNumVertices;
newMesh->m_vertexStride = sizeof(VERTEXT1);
//fill index buffer desc
//only triangles are valid as face
D3D11_BUFFER_DESC ibd;
ibd.ByteWidth = mesh->mNumFaces*3*sizeof(DWORD);
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
ibd.StructureByteStride = 0;
ibd.Usage = D3D11_USAGE_IMMUTABLE;
//create index buffer memory block and subres. data
DWORD *ibMemBlock = new DWORD[mesh->mNumFaces*3];
for(UINT i=0,j=0; i<mesh->mNumFaces ; i++){
aiFace &face = mesh->mFaces[i];
if(face.mNumIndices!=3){
OutputDebugString("Ignoring face");
ibMemBlock[j++] = 0;
ibMemBlock[j++] = 0;
ibMemBlock[j++] = 0;
}else{
ibMemBlock[j++] = face.mIndices[0];
ibMemBlock[j++] = face.mIndices[1];
ibMemBlock[j++] = face.mIndices[2];
}
}
D3D11_SUBRESOURCE_DATA ibSrd;
ibSrd.pSysMem = ibMemBlock;
DXAMHResult(m_d3dDevice->CreateBuffer(&ibd,&ibSrd,&newMesh->m_indexBuffer),DXAE_ERROR_REPORTING_LEVEL_MBOX);
newMesh->m_indexCount = mesh->mNumFaces*3;
IDXACMesh *imesh = newMesh;
imesh->Release();
}else{
//not recognized material
OutputDebugString("Ignoring mesh");
return;
}
}
}
ReleaseCOM(SolidMaterialTechGroup);
ReleaseCOM(ilGroup_PN);
}
我几十年没见过'VOID'。恭喜。 – 2012-03-04 15:41:19
没有奇迹,你花了整整一个小时的时间调试,如果这是你的函数的简化版本 – 2012-03-04 15:43:29
嗯......这个确切的函数显示了我的VS2010调试器下的所有预期变量。你能更具体地说明你做了什么_exactly_吗? – 2012-03-04 15:48:11