典型的shader磚塊

2022-04-02 04:22:39 字數 3051 閱讀 3694

效果:

//頂點

invec4 mcvertex;

//法線

invec3 mcnormal;

//懷疑這些以osg_打頭的都是osg的內建變數

invec3 osg_simulationtime;

uniform mat4 osg_modelviewmatrix;

uniform mat4 osg_modelviewprojectionmatrix;

uniform mat3 osg_normalmatrix;

//光照位置

uniform vec3 lightposition ;

//鏡面光強度

const

float specularcontribution = 0.3

;

//散射光強度

const

float diffusecontribution = 1.0 -specularcontribution;

//光照強度值

outfloat

lightintensity;

//頂點的x,y值

outvec2 mcposition;

void

main()

lightintensity = diffusecontribution * diffuse + specularcontribution *spec;

mcposition =mcvertex.xy;

gl_position = osg_modelviewprojectionmatrix *mcvertex;

}

shader.fs:

#version 140

//轉的顏色 和 磚縫的顏色

uniform vec3 brickcolor = vec3(0,1,0), mortarcolor = vec3(1,0,0

);

//轉的長和寬

uniform vec2 bricksize = vec2(0.3,0.15

);

//磚的寬和高相對於磚縫的寬和高之間的比例

uniform vec2 brickpct = vec2(0.9,0.85

);

//頂點的x、y

invec2 mcposition;

//光照強烈度

infloat

lightintensity;

//片元顏色

outvec4 fragcolor;

void

main()

else

color *=lightintensity;

fragcolor = vec4(color, 1.0

);

}

main.cpp

#include #include 

#include

#include

#include

osg::ref_ptr

lightpos;

class mynodevisitor : public

osg::nodevisitor

virtual

}};int

main()

下面的main.cpp新增了一些與shader無關的東西,在上面的main.cpp中我拿掉了,並把shader提出去了,看著頭疼。

main.cpp

#include #include 

#include

#include

#include

static

char * vertexshader =\n""

lightintensity = diffusecontribution * diffuse + specularcontribution * spec;\n""

mcposition = mcvertex.xy;\n""

gl_position = osg_modelviewprojectionmatrix * mcvertex;\n""

} \n"};

static

char * fragshader =else \n""

color *= lightintensity;\n""

fragcolor = vec4(color, 1.0);\n""

}\n"

};osg::ref_ptr

lightpos;

class mynodevisitor : public

osg::nodevisitor

virtual

}};class lightposcallback : public

osg::uniform::callback

virtual

void

operator()(osg::uniform* uniform, osg::nodevisitor*nv)

};osg::ref_ptr

createlight()

class keyboardeventhandler : public

osgga::guieventhandler

virtual

bool handle(const osgga::guieventadapter& ea, osgga::guiactionadapter&)

if (ea.getkey() == '

y')//

繞y軸旋轉

if (ea.getkey() == '

z')//

繞z軸旋轉}}

return

false

; }

};int

main()

彩色的磚塊

小易有一些彩色的磚塊。每種顏色由乙個大寫字母表示。各個顏色磚塊看起來都完全一樣。現在有乙個給定的字串s,s中每個字元代表小易的某個磚塊的顏色。小易想把他所有的磚塊排成一行。如果最多存在一對不同顏色的相鄰磚塊,那麼這行磚塊就很漂亮的。請你幫助小易計算有多少種方式將他所有磚塊排成漂亮的一行。如果兩種方式...

Shader 各種Shader效果的合集

1.the fresnel effect 參考 實用的shader shader heroshader character a通道標記陣營區域,1 表示有陣營顏色區域,0 表示非陣營顏色區域 emission emission range 0,1 0 自發光 shadowlevel shadow l...

程式設計題 彩色的磚塊

小易有一些彩色的磚塊。每種顏色由乙個大寫字母表示。各個顏色磚塊看起來都完全一樣。現在有乙個給定的字串s,s中每個字元代表小易的某個磚塊的顏色。小易想把他所有的磚塊排成一行。如果最多存在一對不同顏色的相鄰磚塊,那麼這行磚塊就很漂亮的。請你幫助小易計算有多少種方式將他所有磚塊排成漂亮的一行。如果兩種方式...