2013-11-17 6 views
0

Я работаю над простым 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

Из-за того, что вы используете m_Viewport.MinZ и m_Viewport.MaxZ как свою ближнюю/дальнюю плоскость для вашей проекционной матрицы.

В Видовом экране они, как правило, 0-> 1, но значения в матрице проекции различны, поэтому, если вы установите MaxZ = 1 в вашей проекции, ваш треугольник будет обрезаться (как ваш lookat z -10).

Постарайтесь установить проекцию около = 0.5 и far = 200 (что-то в этом роде).

EDIT: Кроме того, я заметил, что ваша позиция вершина -1.0f, 1.0f, 0.0f, 0.0f

Последний компонент должен быть 1.0f

+0

Я изменил прогноз около 0,5 и далеко 200, но он все еще делает то же самое. Шейдер пикселя все еще не работает. :( –

+0

Можете ли вы разместить часть кода C#, которую вы используете, чтобы называть свою ничью? – catflier

+0

Хорошо, я добавил код чертежа в свой пост. –

 Смежные вопросы

  • Нет связанных вопросов^_^