//Transformation Matrices
matrix matW;
matrix matVP;
//World Light Position
float3 lightPos;
//Texture
texture texDiffuse;
//Sampler
sampler DiffuseSampler = sampler_state
{
Texture = (texDiffuse);
MinFilter = Linear; MagFilter = Linear; MipFilter = Linear;
AddressU = Wrap; AddressV = Wrap; AddressW = Wrap;
MaxAnisotropy = 16;
};
//Vertex Input
struct VS_INPUT
{
float4 position : POSITION0;
float3 normal : NORMAL;
float2 tex0 : TEXCOORD0;
};
//Vertex Output / Pixel Shader Input
struct VS_OUTPUT
{
float4 position : POSITION0;
float2 tex0 : TEXCOORD0;
float shade : TEXCOORD1;
};
//Vertex Shader
VS_OUTPUT vs_lighting(VS_INPUT IN)
{
VS_OUTPUT OUT = (VS_OUTPUT)0;
//getting the position of the vertex in the world
float4 posWorld = mul(IN.position, matW);
float4 normal = normalize(mul(IN.normal, matW));
//getting to position to object space
OUT.position = mul(posWorld, matVP);
OUT.shade = max(dot(normal, normalize(lightPos - posWorld)), 0.2f);
OUT.tex0 = IN.tex0;
return OUT;
}
//Pixel Shader
float4 ps_lighting(VS_OUTPUT IN) : COLOR0
{
float4 color = tex2D(DiffuseSampler, IN.tex0);
return color * IN.shade;
}
//Lighting Technique
technique Lighting
{
pass P0
{
Lighting = false;
VertexShader = compile vs_2_0 vs_lighting();
PixelShader = compile ps_2_0 ps_lighting();
}
}
This currently samples the texture color and intermixes it with the shade color based on the lightPos and some constants.
I want to add something like material colors or vertex colors to be some basic colors of the mesh.
Any ideas?
Thanks
Jack
How to add "intrinsic" material color to this pixel shader?
Just add a new float4 constant to the shader and store the material color in that constant.
Then multiply it with the ouput of the pixel shader.
return color * IN.shade * mat_color;
If the material color varies bake it into the diffuse color texture or add a second texture to the shader, sample it like the diffuse texture and multiply with the output.
Thanks, I gave up the texture values, cos I don't make one yet.
However, when I am doing this
return IN.shade * materialColor;
The rendered output is extremely jagged.
How can I improve that?
Update:
void Application::Update(float deltaTime)
{
try
{
//Check for lost device
HRESULT coop = g_pDevice->TestCooperativeLevel();
if(coop != D3D_OK)
{
if(coop == D3DERR_DEVICELOST)
{
if(m_deviceLost == false)
DeviceLost();
}
else if(coop == D3DERR_DEVICENOTRESET)
{
if(m_deviceLost == true)
DeviceGained();
}
Sleep(100);
return;
}
m_deltaTime = deltaTime * 0.4f;
//Keyboard input
if(KeyDown(VK_ESCAPE))
{
Quit();
}
if(KeyDown(VK_RETURN) && KeyDown(18)) //ALT + RETURN
{
//Switch between windowed mode and fullscreen mode
m_present.Windowed = !m_present.Windowed;
DeviceLost();
DeviceGained();
if(m_present.Windowed)
{
RECT rc = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false);
SetWindowPos(m_mainWindow, HWND_NOTOPMOST, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW);
UpdateWindow(m_mainWindow);
}
}
//Toggle Animation
if(KeyDown(VK_RETURN))
{
Sleep(300);
RandomizeAnimations();
}
}
catch(...)
{
g_debug << "Error in Application::Update() \n";
}
}
void Application::DeviceLost()
{
try
{
g_pFont->OnLostDevice();
g_pEffect->OnLostDevice();
m_deviceLost = true;
}
catch(...)
{
g_debug << "Error occured in Application::DeviceLost() \n";
}
}
void Application::DeviceGained()
{
try
{
g_pDevice->Reset(&m_present);
g_pFont->OnResetDevice();
g_pEffect->OnResetDevice();
m_deviceLost = false;
}
catch(...)
{
g_debug << "Error occured in Application::DeviceGained() \n";
}
}
I copied the code from a book. So this presentation parameters are the same when the device is regained.
void Application::DeviceGained()
{
try
{
g_pDevice->Reset(&m_present);
g_pFont->OnResetDevice();
g_pEffect->OnResetDevice();
m_deviceLost = false;
}
catch(...)
{
g_debug << "Error occured in Application::DeviceGained() \n";
}
}
Thanks
Jack
What you mean jagged? Can you post a screenshot?
You should think about switching to per-pixel lighting using Blinn-Phong, I'm guessing that's the problem...
Just feels like as ugly as this image. The edges of the mesh become really jagged when being maximized (windowed mode) only
I have set the default BackBufferHeight + width = 800x600, that is when maximized to 1280x1024
Just feels like as ugly as this image. The edges of the mesh become really jagged when being maximized (windowed mode) onlyI have set the default BackBufferHeight + width = 800x600, that is when maximized to 1280x1024
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_CREATE:
break;
case WM_SIZE:
if( g_pDevice != NULL && wParam != SIZE_MINIMIZED )
{
// invalidateDeviceObjects();
g_present.BackBufferWidth = LOWORD(lParam);
g_present.BackBufferHeight = HIWORD(lParam);
HRESULT hr = g_pDevice->Reset( &g_present );
if( FAILED(hr) )
{
MessageBox( NULL, "Call to Reset() failed with D3DERR_INVALIDCALL! ",
"ERROR", MB_OK | MB_ICONEXCLAMATION );
}
}
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
The error message "Call to Reset()..." is always used.
Thanks
Jack