Я работаю над простым 3D-приложением, которое будет рисовать куб с помощью SlimDX. В настоящее время он должен нарисовать один треугольник на экране, но вместо этого он ничего не делает.SlimDX 3D Graphics Pixelshader Issue
Если я исследую вещи, используя функцию графического отладчика в VS2012, я вижу, что вывод из этапа вершинного шейдера является треугольником, как ожидалось. Но затем мы пропускаем пиксельный шейдер и отправляемся прямо в OutputMerger.
Я установил cullmode никому, но он все еще отказывается запускать пиксельный шейдер. Вот код, который инициализирует матрицы проекции и просмотра.
m_ProjectionMatrix = Matrix.PerspectiveFovLH(0.7853982f, //1.570796f, // this is 90 degrees in radians
(float) m_Form.Width/(float) m_Form.Height,
m_Viewport.MinZ,
m_Viewport.MaxZ);
m_ViewMatrix = Matrix.LookAtLH(new Vector3(3, 1, -10),
new Vector3(0, 0, 0),
new Vector3(0, 1, 0));
Сам треугольник позиционируется в начале координат, поскольку я не применял к нему никакого перевода. Вот данные вершин, которые хранятся в пользовательской структуре вершин. Пока я использую данные позиции, пока не смогу решить эту проблему. Тогда я буду возиться с другими значениями, которые я добавил. Но вот данные вершина:
Vertex[] vertexData =
{
new Vertex() { Position = new Vector4(-1.0f, 1.0f, 0.0f, 0.0f), Color = new Color4(1.0f, 0.0f, 0.0f, 1.0f), TexCoord = new Vector2(0, 0) },
new Vertex() { Position = new Vector4(1.0f, 1.0f, 0.0f, 0.0f), Color = new Color4(1.0f, 0.0f, 1.0f, 0.0f), TexCoord = new Vector2(1, 0) },
new Vertex() { Position = new Vector4(0.0f, -1.0f, 0.0f, 0.0f), Color = new Color4(1.0f, 1.0f, 0.0f, 0.0f), TexCoord = new Vector2(0.5f, 1) },
};
А вот код шейдера:
cbuffer cbPerResize : register(b0)
{
matrix Projection;
};
cbuffer cbPerFrame : register(b1)
{
matrix View;
};
cbuffer cbPerObject : register(b2)
{
matrix World;
};
Texture2D ObjTexture;
SamplerState ObjSamplerState;
//--------------------------------------------------------------------------------------
struct VS_INPUT
{
float4 Pos : POSITION;
float4 Color : COLOR;
float2 TexCoord: TEXCOORD;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 Color : COLOR;
float2 TexCoord: TEXCOORD;
};
PS_INPUT Vertex_Shader(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT) 0;
output.Color = input.Color;
output.TexCoord = input.TexCoord;
output.Pos = mul(input.Pos, World);
output.Pos = mul(output.Pos, View);
output.Pos = mul(output.Pos, Projection);
return output;
}
float4 Pixel_Shader_Color(PS_INPUT input) : SV_TARGET
{
return float4(0.0f, 0.0f, 1.0f, 1.0f);
}
Вот код рисования в моем RenderScene() метод. Мировая матрица для куба только единичная матрица в настоящее время:
// Clear the screen before we draw the next frame.
m_DeviceContext.ClearRenderTargetView(m_RenderTargetView, m_ClearColor);
// Send the cube's world matrix to the changes per object constant buffer.
m_DataStream.Position = 0;
m_DataStream.Write(Matrix.Transpose(m_CubeWorldMatrix));
m_DataStream.Position = 0;
m_Device.ImmediateContext.UpdateSubresource(new DataBox(0, 0, m_DataStream),
m_CbChangesPerObject,
0);
// Draw the triangle that we created in our vertex buffer.
m_DeviceContext.Draw(3, 0);
// Present the frame we just rendered to the user.
m_SwapChain.Present(0,
PresentFlags.None);
Вот выход из стадии InputAssembler. Величина вершины кажется завинченной.
# Visual Studio - VsPix
# Version: 11
# Vertex shader mesh
#
# Generated data
# object insideShape
g insideShape
v -Infinity Infinity NaN
v Infinity Infinity NaN
v NaN -Infinity NaN
f 1 2 3
Это одна из тех очень раздражающих проблем, которые вы просто не можете решить. И по моему опыту эти типы ошибок обычно оказываются вызванными чем-то очень маленьким ... lol
Я проверил постоянные буферы, и похоже, что они правильно установлены. Я здесь в тупике ... Что происходит? Любая помощь приветствуется!
Я изменил прогноз около 0,5 и далеко 200, но он все еще делает то же самое. Шейдер пикселя все еще не работает. :( –
Можете ли вы разместить часть кода C#, которую вы используете, чтобы называть свою ничью? – catflier
Хорошо, я добавил код чертежа в свой пост. –