[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Panda3D - по русски » Panda3D » Примеры кода » Пример попиксельного освещения (Шейдер освещения)
Пример попиксельного освещения
serg-kkzДата: Среда, 01.04.2020, 00:29 | Сообщение # 1
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Адаптировал для панды пример https://gamedev.ru/terms/PerPixelLighting

Код
from panda3d.core import Shader
from direct.showbase.ShowBase import ShowBase

def shader():
    return Shader.make(Shader.SL_GLSL,
vertex="""
#version 120

varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;

attribute vec2 p3d_MultiTexCoord0;
attribute vec4 p3d_Vertex;
attribute vec3 p3d_Normal;

uniform mat4 p3d_ModelViewProjectionMatrix;

void main( void )
{
    gl_Position    = p3d_ModelViewProjectionMatrix * p3d_Vertex;
    gl_TexCoord[0].xy = p3d_MultiTexCoord0;
    
    v_FragmentPosition  = p3d_Vertex.xyz;
    v_FragmentNormal  = p3d_Normal;
}

""",

fragment="""
#version 120

uniform sampler2D p3d_Texture0;
uniform vec3 pos_light;
uniform vec3 pos_camera;

varying vec3 v_FragmentPosition;
varying vec3 v_FragmentNormal;

const vec4  k_LightColor = vec4(1.0, 0.6, 0.3, 1.0);
const float k_Shininess = 64.0;

const float k_ConstAttenuation = 0.5;
const float k_LinearAttenuation = 0.05;
const float k_QuadricAttenuation = 0.001;

void main( void )
{
    vec3  L = pos_light - v_FragmentPosition;

    // ** Used in the calculation of light extinction
    float distance = length( L );

    L = normalize( L );
    vec3  N = normalize( v_FragmentNormal );

    // ** The H vector is used to calculate the gloss (specularity) of a fragment
    vec3  E = normalize( pos_camera - v_FragmentPosition );
    vec3  H = normalize( L + E ); // ** Half-vector

    // ** The calculation coefficient. attenuations
    float attenuation = 1.0 / ( k_ConstAttenuation + k_LinearAttenuation * distance + k_QuadricAttenuation * distance * distance );

    float diffuse = clamp( dot( L, N ), 0.0, 1.0 );
    float specular  = pow( clamp( dot( N, H ), 0.0, 1.0 ), k_Shininess );
  
    if( diffuse <= 0.0 ){
        specular = 0.0;
        }
  
    vec4 diffuseColor  = diffuse * k_LightColor * attenuation;
    vec4 specularColor = specular * k_LightColor * attenuation;
    vec4 ambientColor = vec4(0.01, 0.01, 0.01, 0.01);
    vec4 emissionColor = vec4(0.0, 0.0, 0.0, 0.0);

    gl_FragColor = ( diffuseColor + specularColor + ambientColor + emissionColor) * texture2D(p3d_Texture0, gl_TexCoord[0].xy );
}
""")

from direct.showbase.ShowBase import ShowBase
from panda3d.core import NodePath

class TestPointlight(ShowBase):

    def __init__(self):
        ShowBase.__init__(self)
        
        lihgt = NodePath("lihgt")
        lihg_m = loader.load_model("models/icosphere")
        lihg_m.reparent_to(lihgt)
        lihgt.setPos(-5, 30, 15)
        lihgt.reparent_to(render)
        
        self.room = loader.load_model("models/abstractroom")
        self.room.reparent_to(render)
        self.room.set_shader(shader())
        self.room.set_shader_input("pos_light", lihgt.getPos());
        
        taskMgr.add(self.update, 'camera.update')

    def update(self, task):
        self.room.set_shader_input("pos_camera", camera.getPos());
        return task.cont

demo = TestPointlight()
demo.run()


Прикрепления: 7568769.jpg (97.6 Kb)


ООП  -  

Сообщение отредактировал serg-kkz - Среда, 01.04.2020, 00:31
 
fron_de_befДата: Воскресенье, 05.04.2020, 11:26 | Сообщение # 2
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline
Не то чтобы я реально понимал чем это принципиально отличается от прилагаемой к панде демки, но похвалить за старания надо
 
serg-kkzДата: Воскресенье, 05.04.2020, 13:56 | Сообщение # 3
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Ну я думаю мне стоит пояснить что написание своих шейдеров позволяет контролировать больше вещей, тени, карты рельефа. В панде есть автошейдер, попробуете добавить тени и вы поймете...



У меня есть еще пример много проходного рендера, это в панде оказалось на удивление очень легко настроить. Можно комбинировать несколько шейдеров, в любо случае это лучше автошейдера, где мало что исправишь.


ООП  -  
 
Форум Panda3D - по русски » Panda3D » Примеры кода » Пример попиксельного освещения (Шейдер освещения)
  • Страница 1 из 1
  • 1
Поиск: