球にテクスチャを適用しようとしています。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ファイルはこちら