• Advertisement
Sign in to follow this  

How to add "intrinsic" material color to this pixel shader?

This topic is 1832 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

//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

Share this post


Link to post
Share on other sites
Advertisement
If you just need a constant material color:
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. Edited by TiagoCosta

Share this post


Link to post
Share on other sites

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
 

Edited by lucky6969b

Share this post


Link to post
Share on other sites

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

Edited by lucky6969b

Share this post


Link to post
Share on other sites
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

 

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement