C# XNA 4.0: GraphicsDevice отображает всю модель с одним эффектом, но при использовании другого эффекта для записи в GBuC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 C# XNA 4.0: GraphicsDevice отображает всю модель с одним эффектом, но при использовании другого эффекта для записи в GBu

Сообщение Anonymous »


Во-первых, чтобы сравнить вещи и понять, почему я запутался, вот рабочий эффект, использующий упреждающий рендеринг (NormEffect.fx):

// https://digitalerr0r.net/2009/03/23/xna ... l-mapping/ float4x4 Мир; float4x4 Просмотр; Проекция float4x4; float4 vecLightDir; float4 vecEye; // TODO: добавьте сюда параметры эффекта. текстура ColorMap; сэмплер ColorMapSampler = sampler_state { Текстура = ; // устанавливаем наш сэмплер на использование ColorMap МинФильтр = Линейный; // включена трилинейная фильтрация для этой текстуры МагФильтр = Линейный; МипФильтер = Линейный; //АдресU = Зажим; // устанавливаем нашу текстуру для фиксации //АдресV = Зажим; }; текстура NormalMap; сэмплер NormalMapSampler = sampler_state { Текстура = ; МинФильтр = Линейный; МагФильтр = Линейный; МипФильтер = Линейный; //АдресU = Зажим; //АдресV = Зажим; }; структура VertexShaderInput { Позиция float4: POSITION0; float2 TexCoord: TEXCOORD0; float3 Нормальный: NORMAL0; float3 Бинормальный: BINORMAL0; float3 Касательная: TANGENT0; // TODO: добавить входные каналы, такие как текстура // здесь координаты и цвета вершин. }; структура VertexShaderOutput { Позиция float4: POSITION0; float2 TexCoord: TEXCOORD0; float3 LightDir: TEXCOORD1; float3 Вид: TEXCOORD2; // TODO: добавить выходные данные вершинного шейдера, такие как цвета и текстура // координаты здесь. Эти значения будут автоматически интерполированы. // над треугольником и предоставляется в качестве входных данных для вашего пиксельного шейдера. }; VertexShaderOutput VertexShaderFunction (вход VertexShaderInput) { Выходные данные VertexShaderOutput; float4 worldPosition = mul(input.Position, World); float4 viewPosition = mul(worldPosition, View); output.Position = mul(viewPosition, Projection); float3x3 worldToTangentSpace; worldToTangentSpace[0] = mul(normalize(input.Tangent), World); worldToTangentSpace[1] = mul(normalize(input.Binormal), World); worldToTangentSpace[2] = mul(normalize(input.Normal), World); float4 PosWorld = mul(input.Position, World); output.LightDir = нормализовать (mul (worldToTangentSpace, vecLightDir)); вывод.View = нормализовать(mul(worldToTangentSpace, vecEye - PosWorld)); выход.TexCoord = вход.TexCoord; // TODO: добавьте сюда код вершинного шейдера. обратный вывод; } float4 PixelShaderFunction (вход VertexShaderOutput): COLOR0 { // TODO: добавьте сюда код пиксельного шейдера. float4 Color = tex2D(ColorMapSampler, input.TexCoord); // Получаем цвет нормали. Цвет описывает направление вектора нормали. // и сделать его диапазоном от 0 до 1. //Нормальный float3 N = (2.0 * (tex2D(NormalMapSampler, input.TexCoord))) - 1.0; //Диффузный float D = насыщение (точка (N, input.LightDir)); //Отражение float3 R = нормализовать (2 * D * N - input.LightDir); //Зеркальный float S = pow(saturate(dot(R, input.View)), 2); const float4ambient = float4(0.3, 0.3, 0.3, 1.0); вернуть Цвет*окружающий+Цвет*D+Цвет*S; } техника NormalMapping { пройти P0 { Сэмплер[0] = (ColorMapSampler); Sampler[1] = (NormalMapSampler); VertexShader = скомпилировать vs_2_0 VertexShaderFunction(); PixelShader = скомпилировать ps_2_0 PixelShaderFunction(); } } /* техника Техника1 { пройти Пас1 { // TODO: установите здесь состояния рендеринга. VertexShader = скомпилировать vs_2_0 VertexShaderFunction(); PixelShader = скомпилировать ps_2_0 PixelShaderFunction(); } } */ Обычные вещи:

// ... графики.GraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer); графики.GraphicsDevice.Indices = meshPart.IndexBuffer; normalEffect.DrawSpecial(graphics.GraphicsDevice, meshPart); в

// NormEffect: WhkBaseEffect public void DrawSpecial (GraphicsDevice gDevice, ModelMeshPart meshPart) { Draw (gDevice, meshPart); } // ДА, Я ЗНАЮ, ЭТО БЕСПОЛЕЗНАЯ ФУНКЦИЯ. Я просто последовательна в занятиях. в

// WhkBaseEffect protected void Draw (GraphicsDevice gDevice, ModelMeshPart meshPart) { foreach (проход EffectPass в CurrentTechnique.Passes) { //EffectPass.Apply обновит устройство до //начинаем использовать информацию о состоянии, определенную в текущем проходе пройти.Применить(); //theMesh содержит всю информацию, необходимую для рисования //текущая сетка gDevice.DrawIndexedPrimitives( PrimitiveType.TriangleList, 0, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount); } } В результате происходит рендеринг всей модели. (Для тестирования использовалась текстура SCP 173.)

А вот GBuffer.fx:

float4x4 World; float4x4 Просмотр; Проекция float4x4; // TODO: добавьте сюда параметры эффекта. текстура ColorMap; сэмплер ColorMapSampler = sampler_state { Текстура = ; // устанавливаем наш сэмплер на использование ColorMap МинФильтр = Линейный; // включена трилинейная фильтрация для этой текстуры МагФильтр = Линейный; МипФильтер = Линейный; //АдресU = Зажим; // устанавливаем нашу текстуру для фиксации //АдресV = Зажим; }; текстура NormalMap; сэмплер NormalMapSampler = sampler_state { Текстура = ; МинФильтр = Линейный; МагФильтр = Линейный; МипФильтер = Линейный; //АдресU = Зажим; //АдресV = Зажим; }; структура VertexShaderInput { Позиция float4: POSITION0; float2 TexCoord: TEXCOORD0; float3 Нормальный: NORMAL0; float3 Бинормальный: BINORMAL0; float3 Касательная: TANGENT0; // TODO: добавить входные каналы, такие как текстура // здесь координаты и цвета вершин. }; структура VertexShaderOutput { Позиция float4: POSITION0; float2 TexCoord: TEXCOORD0; float4 WorldPosition: TEXCOORD1; float3 Касательная: TEXCOORD2; float3 Бинормальный: TEXCOORD3; float3 Обычный: TEXCOORD4; Глубина float2: TEXCOORD5; // TODO: добавить выходные данные вершинного шейдера, такие как цвета и текстура // координаты здесь. Эти значения будут автоматически интерполированы. // над треугольником и предоставляется в качестве входных данных для вашего пиксельного шейдера. }; VertexShaderOutput VertexShaderFunction(VertexShaderInput input) // Можно разделить на несколько функций, чтобы сократить вычисления... { Выход VertexShaderOutput = (VertexShaderOutput)0; float4 worldPosition = mul(input.Position, World); float4 viewPosition = mul(worldPosition, View); output.Position = mul(viewPosition, Projection); вывод.WorldPosition = вывод.Позиция; выход.Тангент = (мул(мул(мул(вход.Тангент, Мир), Вид), Проекция) - выход.Позиция).xyz; output.Binormal = (mul(mul(mul(input.Binormal, World), View), Projection) - output.Position).xyz; output.Normal = (mul(mul(mul(input.Normal, World), View), Projection) - output.Position).xyz; вывод.Глубина = вывод.Позиция.zw; выход.TexCoord = вход.TexCoord; // TODO: добавьте сюда код вершинного шейдера. обратный вывод; } float4 ColorBufferShader (вход VertexShaderOutput): COLOR0 { // TODO: добавьте сюда код пиксельного шейдера. float4 Color = tex2D(ColorMapSampler, input.TexCoord); const float4ambient = float4(0.3, 0.3, 0.3, 1.0); вернуть Цвет * окружающий; } float4 NormalBufferShader (вход VertexShaderOutput): COLOR0 { float3 N = (2.0 * (tex2D(NormalMapSampler, input.TexCoord))) - 1.0; // от -1,0 до 1,0 float3 FinalNorm = нормализовать((input.Normal * N.b) + (input.Tangent * N.r) + (input.Binormal * N.g)); return float4((finalNorm + 1,0) * 0,5, 1,0); } float4 DepthBufferShader (вход VertexShaderOutput): COLOR0 { вернуть input.Depth.x / input.Depth.y; } техника GColor { пройти P0 { Сэмплер[0] = (ColorMapSampler); VertexShader = скомпилировать vs_2_0 VertexShaderFunction(); PixelShader = скомпилировать ps_2_0 ColorBufferShader(); } } техника GНормальный { пройти P0 { Sampler[0] = (NormalMapSampler); VertexShader = скомпилировать vs_2_0 VertexShaderFunction(); PixelShader = скомпилировать ps_2_0 NormalBufferShader(); } } техника GDepth { пройти P0 { VertexShader = скомпилировать vs_2_0 VertexShaderFunction(); PixelShader = скомпилировать ps_2_0 DepthBufferShader(); } } /* техника Техника1 { пройти Пас1 { // TODO: установите здесь состояния рендеринга. VertexShader = скомпилировать vs_2_0 VertexShaderFunction(); PixelShader = скомпилировать ps_2_0 PixelShaderFunction(); } } */ Опять обычные вещи:

// ... графики.GraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer); графики.GraphicsDevice.Indices = meshPart.IndexBuffer; gBufferEffect.DrawSpecial(graphics.GraphicsDevice, meshPart, colorRT,normalRT, глубинаRT, i
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»