0

球にテクスチャを適用しようとしています。3D モデリング ソフトウェアを使用して、.obj ファイルとしてエクスポートされた頂点、法線、texcoords を使用して球を作成しました。ファイルを解析し、データを含む頂点バッファーを作成します。IDE は Visual C++ 2012 です。テクスチャは 512x256 jpg の地球です (オリジナルですね? ) 。運が悪かったので、さまざまな UV マッピングを試していました。

リソースを読み込んでいます:

D3DX11CreateShaderResourceViewFromFile(dev,        // the Direct3D device
    L"earth.jpg",    
    NULL,           
    NULL,           
    &pTexture,      
    NULL);          
devcon->PSSetShaderResources(0, 1, &pTexture);

解析ファイル:

if (fileIn) {
    while (fileIn) {
        VERTEX vertex;
        inChar = fileIn.get();
        std::wstring string;
        switch (inChar)
        {       
        case '#':
            inChar = fileIn.get();
            while(inChar != '\n')
                inChar = fileIn.get();
            break;
        case 'v':
            inChar = fileIn.get();
            if (inChar == ' ')  //v - vert position
            {
                fileIn >> x >> y >> z;                      
                vVector.push_back(D3DXVECTOR3(x, y, z));
                vertCount++;
            }
            else if(inChar == 'n')  //vn - vert normal
            {
                fileIn >> x >> y >> z;                      
                nVector.push_back(D3DXVECTOR3(x, y, z));                    
                normCount++;
            }
            else if(inChar == 't')  //vt - vert tex coords
            {           
                fileIn >> u >> v;                       
                tVector.push_back(D3DXVECTOR2(u, v));
                texCount++;
            }
            break;
        case 'f': // assuming vectors are filled..
            inChar = fileIn.get();
            if (inChar != ' ')
                break;
            while (!fileIn.eof()) {
                std::getline(fileIn, string);

                size_t pos = 0;
                while((pos = string.find(L"/", pos)) != std::string::npos)
                {
                    string.replace(pos, 1, L" ");
                    pos++;
                }
                if (string.find(L"f ") != std::wstring::npos)
                    string = string.replace(0, 2, L"");
                std::wistringstream iss(string);
                iss.seekg(0, std::ios::beg);
                while (iss >> i) {
                    iVector.push_back(i);
                }
            }
            break;
        }
    }
}

int vv, vt, vn;
for (i = 0; i < iVector.size(); i += 3) {
    vv  = iVector.at(i) - 1;
    vt = iVector.at(i + 1) - 1;
    vn = iVector.at(i + 2) - 1;
    VERTEX vertex;
    vertex.X = vVector.at(vv).x;
    vertex.Y = vVector.at(vv).y;
    vertex.Z = vVector.at(vv).z;
    vertex.U = tVector.at(vt).x;
    vertex.V = tVector.at(vt).y;
    vertex.Normal.x = nVector.at(vn).x;
    vertex.Normal.y = nVector.at(vn).y;
    vertex.Normal.z = nVector.at(vn).z;
    vector.push_back(vertex);
}

ピクセル シェーダー:

float4 outputColor = (1.0f, 0.0f, 1.0f, 1.0f);
if (calc == 0) {
    outputColor = lightAmbient;
    float3 lightVector = lightPos.xyz - input.worldPosition.xyz;
    float3 normalVector = input.normal.xyz;
    float distance = length(lightVector);
    //if (distance > range) 
        //return outputColor;
    float diffuseBrightness = saturate(dot(normalize(normalVector), normalize(lightVector)));
    outputColor += diffuseBrightness;
    //outputColor *= lightAtt.x + (lightAtt.y * distance) + (lightAtt.z * (distance * distance));
    outputColor = saturate(outputColor);

    outputColor *= Texture.Sample(ss, input.texcoord);
}
return outputColor;

何か案は?助けていただければ幸いです。OBJファイルはこちら

4

0 に答える 0