Directx11 项目将不显示图形输出
Posted
技术标签:
【中文标题】Directx11 项目将不显示图形输出【英文标题】:Directx11 Project will not display graphical output 【发布时间】:2018-04-13 12:29:49 【问题描述】:我对 Directx 还很陌生,所以我几乎不知道这里发生了什么。
我已确认窗口和 DirectX API 的初始设置和激活已成功。然而,尽管绘图和更新功能似乎完全可以运行,但它们在显示输出方面仍然没有成功。我已经检查了链接器、我的对象类、我的效果文件以及基本上整个项目十几次。请帮忙!
立方体.h
#pragma once
#pragma comment(lib,"d3d11.lib")
#include <d3d11.h>
#include <d3dcompiler.h>
#include <DirectXMath.h>
#include <string>
#include <WICTextureLoader.h>
#include <d3d11_2.h>
#include <vector>
using namespace DirectX;
struct Vertex
XMFLOAT3 pos;
XMFLOAT2 texCoord;
XMFLOAT3 normal;
;
using namespace DirectX;
class Cube
private:
Vertex vertices[24];
XMMATRIX RotX, RotZ, RotY,trans;
double scale;
XMFLOAT3 loc;
DWORD indices[36];
ID3D11DeviceContext* d3dDevCon;
ID3D11Device*d3dDev;
ID3D11ShaderResourceView*CubeTexture;
XMMATRIX cubeWorld;
public:
Cube();
Cube(double,double,double, double, XMFLOAT3,ID3D11DeviceContext*,ID3D11Device*,std::string );
~Cube();
Vertex* getVertices();
void Rotate(double,double,double);
void Move(double,double,double);
void Draw();
void Update();
XMMATRIX getWorld();
DWORD* getIndices();
ID3D11ShaderResourceView*getCubeTexture();
;
立方体.cpp
#include "stdafx.h"
#include "Cube.h"
using namespace DirectX;
Cube::Cube()
RotX = XMMatrixRotationAxis(XMVectorSet(1.0, 0.0, 0.0, 0.0), 0);
RotY = XMMatrixRotationAxis(XMVectorSet(0.0, 1.0, 0.0, 0.0), 0);
RotZ = XMMatrixRotationAxis(XMVectorSet(0.0, 0.0, 1.0, 0.0), 0);
scale = 1;
loc = XMFLOAT3(0.0, 0.0, 0.0);
Vertex v[] =
//remember that structs do not have constructors unless defined!
// Front Face
-1.0f, -1.0f, -1.0f , 0.0f, 1.0f , -1.0f, -1.0f, -1.0f ,
-1.0f, 1.0f, -1.0f , 0.0f, 0.0f , -1.0f, 1.0f, -1.0f ,
1.0f, 1.0f, -1.0f , 1.0f, 0.0f , 1.0f, 1.0f, -1.0f ,
1.0f, -1.0f, -1.0f , 1.0f, 1.0f , 1.0f, -1.0f, -1.0f ,
// Back Face
-1.0f, -1.0f, 1.0f , 1.0f, 1.0f , -1.0f, -1.0f, 1.0f ,
1.0f, -1.0f, 1.0f , 0.0f, 1.0f , 1.0f, -1.0f, 1.0f ,
1.0f, 1.0f, 1.0f , 0.0f, 0.0f , 1.0f, 1.0f, 1.0f ,
-1.0f, 1.0f, 1.0f , 1.0f, 0.0f , -1.0f, 1.0f, 1.0f ,
// Top Face
-1.0f, 1.0f, -1.0f , 1.0f, 1.0f , -1.0f, 1.0f, -1.0f ,
-1.0f, 1.0f, 1.0f , 0.0f, 1.0f , -1.0f, 1.0f, 1.0f ,
1.0f, 1.0f, 1.0f , 0.0f, 0.0f , 1.0f, 1.0f, 1.0f ,
1.0f, 1.0f, -1.0f , 1.0f, 0.0f , 1.0f, 1.0f, -1.0f ,
// Bottom Face
-1.0f, -1.0f, -1.0f , 1.0f, 1.0f , -1.0f, -1.0f, -1.0f ,
1.0f, -1.0f, -1.0f , 0.0f, 1.0f , 1.0f, -1.0f, -1.0f ,
1.0f, -1.0f, 1.0f , 0.0f, 0.0f , 1.0f, -1.0f, 1.0f ,
-1.0f, -1.0f, 1.0f , 1.0f, 0.0f , -1.0f, -1.0f, 1.0f ,
// Left Face
-1.0f, -1.0f, 1.0f , 0.0f, 1.0f , -1.0f, -1.0f, 1.0f ,
-1.0f, 1.0f, 1.0f , 0.0f, 0.0f , -1.0f, 1.0f, 1.0f ,
-1.0f, 1.0f, -1.0f , 1.0f, 0.0f , -1.0f, 1.0f, -1.0f ,
-1.0f, -1.0f, -1.0f , 1.0f, 1.0f , -1.0f, -1.0f, -1.0f ,
// Right Face
1.0f, -1.0f, -1.0f , 0.0f, 1.0f , 1.0f, -1.0f, -1.0f ,
1.0f, 1.0f, -1.0f , 0.0f, 0.0f , 1.0f, 1.0f, -1.0f ,
1.0f, 1.0f, 1.0f , 1.0f, 0.0f , 1.0f, 1.0f, 1.0f ,
1.0f, -1.0f, 1.0f , 1.0f, 1.0f , 1.0f, -1.0f, 1.0f
;
for (int i = 0; i < 24; i++)
vertices[i] = v[i];
DWORD ind[] =
// Front Face
0, 1, 2,
0, 2, 3,
// Back Face
4, 5, 6,
4, 6, 7,
// Top Face
8, 9, 10,
8, 10, 11,
// Bottom Face
12, 13, 14,
12, 14, 15,
// Left Face
16, 17, 18,
16, 18, 19,
// Right Face
20, 21, 22,
20, 22, 23
;
for (int s = 0; s < 36; s++)
indices[s] = ind[s];
Cube::Cube(double rotx,double roty,double rotz, double scale, XMFLOAT3 loc,ID3D11DeviceContext*devcon, ID3D11Device*dev,std::string name )
RotX = XMMatrixRotationAxis(XMVectorSet(1.0, 0.0, 0.0, 0.0), rotx);
RotY = XMMatrixRotationAxis(XMVectorSet(0.0, 1.0, 0.0, 0.0), roty);
RotZ = XMMatrixRotationAxis(XMVectorSet(0.0, 0.0, 1.0, 0.0), rotz);
this->scale = scale;
this->loc = loc;
d3dDevCon = devcon;
d3dDev = dev;
CreateWICTextureFromFile(d3dDev, L"gray.jpg", NULL, &CubeTexture, 0);
Vertex v[] =
//remember that structs do not have constructors unless defined!
// Front Face
-1.0f, -1.0f, -1.0f , 0.0f, 1.0f , -1.0f, -1.0f, -1.0f ,
-1.0f, 1.0f, -1.0f , 0.0f, 0.0f , -1.0f, 1.0f, -1.0f ,
1.0f, 1.0f, -1.0f , 1.0f, 0.0f , 1.0f, 1.0f, -1.0f ,
1.0f, -1.0f, -1.0f , 1.0f, 1.0f , 1.0f, -1.0f, -1.0f ,
// Back Face
-1.0f, -1.0f, 1.0f , 1.0f, 1.0f , -1.0f, -1.0f, 1.0f ,
1.0f, -1.0f, 1.0f , 0.0f, 1.0f , 1.0f, -1.0f, 1.0f ,
1.0f, 1.0f, 1.0f , 0.0f, 0.0f , 1.0f, 1.0f, 1.0f ,
-1.0f, 1.0f, 1.0f , 1.0f, 0.0f , -1.0f, 1.0f, 1.0f ,
// Top Face
-1.0f, 1.0f, -1.0f , 1.0f, 1.0f , -1.0f, 1.0f, -1.0f ,
-1.0f, 1.0f, 1.0f , 0.0f, 1.0f , -1.0f, 1.0f, 1.0f ,
1.0f, 1.0f, 1.0f , 0.0f, 0.0f , 1.0f, 1.0f, 1.0f ,
1.0f, 1.0f, -1.0f , 1.0f, 0.0f , 1.0f, 1.0f, -1.0f ,
// Bottom Face
-1.0f, -1.0f, -1.0f , 1.0f, 1.0f , -1.0f, -1.0f, -1.0f ,
1.0f, -1.0f, -1.0f , 0.0f, 1.0f , 1.0f, -1.0f, -1.0f ,
1.0f, -1.0f, 1.0f , 0.0f, 0.0f , 1.0f, -1.0f, 1.0f ,
-1.0f, -1.0f, 1.0f , 1.0f, 0.0f , -1.0f, -1.0f, 1.0f ,
// Left Face
-1.0f, -1.0f, 1.0f , 0.0f, 1.0f , -1.0f, -1.0f, 1.0f ,
-1.0f, 1.0f, 1.0f , 0.0f, 0.0f , -1.0f, 1.0f, 1.0f ,
-1.0f, 1.0f, -1.0f , 1.0f, 0.0f , -1.0f, 1.0f, -1.0f ,
-1.0f, -1.0f, -1.0f , 1.0f, 1.0f , -1.0f, -1.0f, -1.0f ,
// Right Face
1.0f, -1.0f, -1.0f , 0.0f, 1.0f , 1.0f, -1.0f, -1.0f ,
1.0f, 1.0f, -1.0f , 0.0f, 0.0f , 1.0f, 1.0f, -1.0f ,
1.0f, 1.0f, 1.0f , 1.0f, 0.0f , 1.0f, 1.0f, 1.0f ,
1.0f, -1.0f, 1.0f , 1.0f, 1.0f , 1.0f, -1.0f, 1.0f
;
for (int i = 0; i < 24; i++)
vertices[i] = v[i];
DWORD ind[] =
// Front Face
0, 1, 2,
0, 2, 3,
// Back Face
4, 5, 6,
4, 6, 7,
// Top Face
8, 9, 10,
8, 10, 11,
// Bottom Face
12, 13, 14,
12, 14, 15,
// Left Face
16, 17, 18,
16, 18, 19,
// Right Face
20, 21, 22,
20, 22, 23
;
for (int s = 0; s < 36; s++)
indices[s] = ind[s];
Cube::~Cube()
void Cube::Rotate(double rotx, double roty, double rotz)
RotX = XMMatrixRotationAxis(XMVectorSet(1.0, 0.0, 0.0, 0.0), rotx);
RotY = XMMatrixRotationAxis(XMVectorSet(0.0, 1.0, 0.0, 0.0), roty);
RotZ = XMMatrixRotationAxis(XMVectorSet(0.0, 0.0, 1.0, 0.0), rotz);
void Cube::Move(double x,double y, double z)
trans = XMMatrixTranslation(x, y, z);
void Cube::Update()
cubeWorld = XMMatrixIdentity();
cubeWorld = trans*RotX*RotY*RotZ;
void Cube::Draw()
return;
XMMATRIX Cube::getWorld()
return cubeWorld;
Vertex* Cube::getVertices()
return vertices;
DWORD* Cube::getIndices()
return indices;
ID3D11ShaderResourceView* Cube::getCubeTexture()
return CubeTexture;
标题
#pragma comment(lib,"D3D11.lib")
#pragma comment(lib,"d3dcompiler.lib")
#pragma comment(lib,"DXGI.lib")
#pragma comment(lib,"dwrite.lib")
#pragma comment(lib,"dinput8.lib")
#pragma comment(lib,"dxguid.lib")
#include "stdafx.h"
#include "Cube.h"
#include "D3DIndependentExperimentation.h"
#include <d3d11.h>
#include <d3dcompiler.h>
#include <DirectXMath.h>
#include <dinput.h>
#include <vector>
#include <iostream>
#include <d3dcompiler.h>
DrawScene()
void DrawScene(std::vector<Cube> cubelist) // performs actual rendering
//clear backbuffer
float bgColor[4] = 0.0, 0.0, 0.0, 0.0f ;
d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor);
//clear depth stencil
d3d11DevCon->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0, 0.0);
//set default blend state(no blending)
d3d11DevCon->OMSetBlendState(0, 0, 0xffffff);
World = XMMatrixIdentity();
d3d11DevCon->PSSetConstantBuffers(0, 1, &cbPerFrameBuffer);
d3d11DevCon->VSSetShader(VS, 0, 0);
d3d11DevCon->PSSetShader(PS, 0, 0);
constBufferPerFrame.light = light;
d3d11DevCon->UpdateSubresource(cbPerFrameBuffer, 0, NULL, &constBufferPerFrame, 0, 0);
d3d11DevCon->OMSetRenderTargets(1, &renderTargetView, depthStencilView);
d3d11DevCon->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0);
//set buffer data
UINT stride = sizeof(Vertex);//size of each Vertex
UINT offset = 0;// how far from the buffer beginning we start
d3d11DevCon->IASetVertexBuffers(0, 1, &VertexBuffer, &stride, &offset);
//TODO: everything
XMMATRIX cubeWorld = XMMatrixIdentity();
for (int i = 0; i < cubelist.size(); i++)
Cube active = cubelist.at(i);
cubeWorld = active.getWorld();
WVP = cubeWorld*camView*camProjection;
cbPerObj.WVP = XMMatrixTranspose(WVP);
cbPerObj.World = XMMatrixTranspose(cubeWorld);
d3d11DevCon->UpdateSubresource(cbPerObjectBuffer, 0, NULL, &cbPerObj, 0, 0);
d3d11DevCon->VSSetConstantBuffers(0, 1, &cbPerObjectBuffer);
ID3D11ShaderResourceView* temp = active.getCubeTexture();
d3d11DevCon->PSSetShaderResources(0, 1, &temp);
d3d11DevCon->PSSetSamplers(0, 1, &CubesTexSamplerState);
d3d11DevCon->RSSetState(NOcullMode);
d3d11DevCon->DrawIndexed(36, 36 * i, 24 * i);
SwapChain->Present(0, 0);
初始化场景()
bool InitScene(std::vector<Cube> cubelist)
HRESULT hr;
//Compiling Shaders
hr = D3DCompileFromFile(L"effects.fx", 0, 0, "VS", "vs_5_0", 0, 0, &VS_Buffer, 0);
hr = D3DCompileFromFile(L"effects.fx", 0, 0, "PS", "ps_5_0", 0, 0, &PS_Buffer, 0);
//Creating Shaders
hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);
hr = d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);
//Setting Shaders
d3d11DevCon->VSSetShader(VS, NULL, NULL);
d3d11DevCon->PSSetShader(PS, NULL, NULL);
//Creating and populating Vertex Buffers
//Buffer description
D3D11_BUFFER_DESC vertexBufferDesc;
ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));
vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT; //describes how buffer is used
vertexBufferDesc.ByteWidth = sizeof(Vertex)*cubelist.size() *24; // specifies the size of buffer; dependent on amount of vertices passed and size of vertices
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;//Specifies that this is a vertex buffer
vertexBufferDesc.CPUAccessFlags = 0;
vertexBufferDesc.MiscFlags = 0;
//Specifies what kind of data is placed in buffer
D3D11_SUBRESOURCE_DATA vertexBufferData;
ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));
std::vector<Vertex> cubeVertices;
for (int i = 0; i < cubelist.size(); i++)
Vertex *point = cubelist.at(i).getVertices();
cubeVertices.insert(cubeVertices.end(), point, point + 24);
vertexBufferData.pSysMem = &cubeVertices;
hr = d3d11Device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &VertexBuffer);
//Buffer description is mostly the same as vertex buffer
D3D11_BUFFER_DESC indexBufferDesc;
ZeroMemory(&indexBufferDesc, sizeof(indexBufferDesc));
indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
indexBufferDesc.ByteWidth = sizeof(DWORD) * 36*cubelist.size();
indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = 0;
indexBufferDesc.MiscFlags = 0;
std::vector<short> cubeIndices;
D3D11_SUBRESOURCE_DATA indexBufferData;
ZeroMemory(&indexBufferData, sizeof(indexBufferData));
for (int i = 0; i < cubelist.size(); i++)
DWORD*point = cubelist.at(i).getIndices();
cubeIndices.insert(cubeIndices.end(), point, point + 36);
indexBufferData.pSysMem = &cubeIndices;
d3d11Device->CreateBuffer(&indexBufferDesc, &indexBufferData, &IndexBuffer);
//set input layout
hr = d3d11Device->CreateInputLayout(layout, NUMELEMENTS, VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), &vertLayout);
d3d11DevCon->IASetInputLayout(vertLayout);
d3d11DevCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
//Create and set viewport
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = SCREENWIDTH;
viewport.Height = SCREENHEIGHT;
viewport.MinDepth = 0.0;
viewport.MaxDepth = 1.0;
d3d11DevCon->RSSetViewports(1, &viewport);
D3D11_BUFFER_DESC constantBufferDesc;
ZeroMemory(&constantBufferDesc, sizeof(D3D11_BUFFER_DESC));
constantBufferDesc.Usage = D3D11_USAGE_DEFAULT;
constantBufferDesc.ByteWidth = sizeof(cbPerObject);
constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constantBufferDesc.CPUAccessFlags = 0;
constantBufferDesc.MiscFlags = 0;
hr = d3d11Device->CreateBuffer(&constantBufferDesc, NULL, &cbPerObjectBuffer);
ZeroMemory(&constantBufferDesc, sizeof(D3D11_BUFFER_DESC));
constantBufferDesc.Usage = D3D11_USAGE_DEFAULT;
constantBufferDesc.ByteWidth = sizeof(cbPerFrame);
constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constantBufferDesc.CPUAccessFlags = 0;
constantBufferDesc.MiscFlags = 0;
hr = d3d11Device->CreateBuffer(&constantBufferDesc, NULL, &cbPerFrameBuffer);
camPosition = XMVectorSet(0.0f, 5.0f, -10.0f, 0.0f);
camTarget = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
camUp = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
camView = XMMatrixLookAtLH(camPosition, camTarget, camUp);
camProjection = XMMatrixPerspectiveFovLH(0.4f*3.14f, (float)SCREENWIDTH / SCREENHEIGHT, 1.0f, 1000.0f);
//Describe and create rasterizer state
D3D11_RASTERIZER_DESC wfdesc;
ZeroMemory(&wfdesc, sizeof(D3D11_RASTERIZER_DESC));
wfdesc.FillMode = D3D11_FILL_SOLID;
wfdesc.CullMode = D3D11_CULL_NONE;
hr = d3d11Device->CreateRasterizerState(&wfdesc, &FULL);
//hr = CreateWICTextureFromFile(d3d11Device, L"gray.jpg", NULL, &CubeTexture, 0);
D3D11_SAMPLER_DESC sampDesc;
ZeroMemory(&sampDesc, sizeof(sampDesc));
sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
sampDesc.MinLOD = 0;
sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
hr = d3d11Device->CreateSamplerState(&sampDesc, &CubesTexSamplerState);
//describe and create blend state
/*D3D11_BLEND_DESC blendDesc;
ZeroMemory(&blendDesc, sizeof(blendDesc));
D3D11_RENDER_TARGET_BLEND_DESC rtbd;
ZeroMemory(&rtbd, sizeof(rtbd));
rtbd.BlendEnable = true;
rtbd.SrcBlend = D3D11_BLEND_SRC_COLOR;
rtbd.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
rtbd.BlendOp = D3D11_BLEND_OP_ADD;
rtbd.SrcBlendAlpha = D3D11_BLEND_ONE;
rtbd.DestBlendAlpha = D3D11_BLEND_ZERO;
rtbd.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtbd.RenderTargetWriteMask = D3D10_COLOR_WRITE_ENABLE_ALL;
blendDesc.AlphaToCoverageEnable = false;
blendDesc.RenderTarget[0] = rtbd;
//d3d11Device->CreateBlendState(&blendDesc, &Transparency);*/
//define rasterizer states for blending
D3D11_RASTERIZER_DESC cmdesc;
ZeroMemory(&cmdesc, sizeof(D3D11_RASTERIZER_DESC));
cmdesc.CullMode = D3D11_CULL_BACK;
cmdesc.FillMode = D3D11_FILL_SOLID;
cmdesc.FrontCounterClockwise = true;
hr = d3d11Device->CreateRasterizerState(&cmdesc, &CCWcullMode);
cmdesc.FrontCounterClockwise = false;
hr = d3d11Device->CreateRasterizerState(&cmdesc, &CWcullMode);
cmdesc.CullMode = D3D11_CULL_NONE;
hr = d3d11Device->CreateRasterizerState(&cmdesc, &NOcullMode);
//light setting
//light.dir = XMFLOAT3(1.0f, 0.0f, 0.0f);
light.ambient = XMFLOAT4(0.3f, 0.3f, 0.3f, 1.0f);
light.diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
light.pos = XMFLOAT3(2.0f, 4.0f, 0.0f);
light.range = 250.0f;
light.att = XMFLOAT3(0.0f, 0.2f, 0.0f);
return true;
效果.fx
cbuffer cbPerObject
float4x4 WVP;
float4x4 World;
;
//note: keep structure of structs in fx files same as those in c++ code.
struct Light
float3 dir;
float3 att;
float3 pos;
float range;
float4 ambient;
float4 diffuse;
;
cbuffer cbPerFrame
Light light;
;
struct VS_OUTPUT
float4 Pos : SV_POSITION;
float2 texCoord : TEXCOORD;
float3 normal: NORMAL;
float4 worldPos: POSITION;
;
Texture2D ObjTexture;
SamplerState ObjSamplerState;
VS_OUTPUT VS(float4 inPos: POSITION, float2 texCoord : TEXCOORD, float3 normal : NORMAL)
VS_OUTPUT output;
output.texCoord = texCoord;
output.Pos = mul(inPos, WVP);
output.worldPos = mul(inPos, World);
output.normal = mul(normal, World);
return output;
float4 PS(VS_OUTPUT input) : SV_TARGET
input.normal = normalize(input.normal);
float4 diffuse = ObjTexture.Sample(ObjSamplerState, input.texCoord);
float3 finalColor = float3(0.0, 0.0, 0.0);
float3 lightToPixelVec = light.pos - input.worldPos;
float d = length(lightToPixelVec);
float3 finalAmbient = diffuse*light.ambient;
if (d > light.range)
return float4(finalAmbient, diffuse.a);
lightToPixelVec /= d;
float Intensity = dot(lightToPixelVec, input.normal)*20;
if (Intensity > 0.0f)
finalColor += Intensity*diffuse*light.diffuse;
finalColor /= light.att[0] + (light.att[1] * d) + (light.att[2] * (d*d));
finalColor = saturate(finalColor + finalAmbient);
return float4(1.0, 1.0, 1.0, 1.0);//float4(finalColor,diffuse.a);
float4 D2D_PS(VS_OUTPUT input) : SV_TARGET
input.normal = normalize(input.normal);
float4 diffuse = ObjTexture.Sample(ObjSamplerState, input.texCoord);
return diffuse;
如果需要更多信息,我愿意提供帮助。
【问题讨论】:
调试图形应用程序是一项具有挑战性和复杂性的任务。任何数量的步骤都可能导致“空白屏幕”。启用 Direct3D 设备窃听。运行最小的设备和交换链。然后一步一步添加东西,每次都测试。 一些开始的资源:@987654321@、Direct3D Game templates、DeviceResources 实现和DirectX Tool Kit for DirectX 11 tutorials。 【参考方案1】:查看您的代码并将其与我过去为 DirectX 11 渲染编写的代码进行比较,您至少缺少一件事 - 深度/模板状态。如果您决定在没有它的情况下使用深度/模板缓冲区,我不确定 GPU 会做什么,但它看起来是您的系统发出的调用(不起作用)和我的系统发出的调用之间的唯一区别(确实如此)。
您可以使用ID3D11Device::CreateDepthStencilState
创建深度/模板状态,并使用ID3D11DeviceContext::OMSetDepthStencilState
将其设置为管道。此函数与ID3D11DeviceContext::OMSetBlendState
的作用相同,将nullptr
、NULL
或0
作为状态对象将绑定默认状态。
【讨论】:
以上是关于Directx11 项目将不显示图形输出的主要内容,如果未能解决你的问题,请参考以下文章
C++小项目:directx11图形程序:cameraclass
C++小项目:directx11图形程序:particleSysclass
Visual Studio图形调试器详细使用教程(基于DirectX11)