本文整理汇总了C++中Context::BlendFunc方法的典型用法代码示例。如果您正苦于以下问题:C++ Context::BlendFunc方法的具体用法?C++ Context::BlendFunc怎么用?C++ Context::BlendFunc使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Context
的用法示例。
在下文中一共展示了Context::BlendFunc方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: gl
SortingExample(void)
: gl()
, particles(4096)
, dist_proc(particles)
, sort_proc(particles)
, draw_proc(particles)
{
gl.ClearColor(0.3f, 0.3f, 0.3f, 0.0f);
gl.Enable(Capability::DepthTest);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例2: attr
//.........这里部分代码省略.........
"uniform mat4 CameraMatrix;"
"in vec4 Position;"
"in float Age;"
"out float vertAge;"
"void main(void)"
"{"
" gl_Position = CameraMatrix * Position;"
" vertAge = Age;"
"}"
);
// compile it
vs.Compile();
// Set the geometry shader source
gs.Source(
"#version 330\n"
"layout(points) in;"
"layout(triangle_strip, max_vertices = 4) out;"
"uniform mat4 ProjectionMatrix;"
"in float vertAge[];"
"out float geomAge;"
"void main(void)"
"{"
" if(vertAge[0] > 1.0) return;"
" float s = 0.5;"
" float yo[2] = float[2](-1.0, 1.0);"
" float xo[2] = float[2](-1.0, 1.0);"
" for(int j=0;j!=2;++j)"
" for(int i=0;i!=2;++i)"
" {"
" float xoffs = xo[i]*(1.0+vertAge[0])*s;"
" float yoffs = yo[j]*(1.0+vertAge[0])*s;"
" gl_Position = ProjectionMatrix * vec4("
" gl_in[0].gl_Position.x-xoffs,"
" gl_in[0].gl_Position.y-yoffs,"
" gl_in[0].gl_Position.z,"
" 1.0"
" );"
" geomAge = vertAge[0];"
" EmitVertex();"
" }"
" EndPrimitive();"
"}"
);
// compile it
gs.Compile();
// set the fragment shader source
fs.Source(
"#version 330\n"
"in float geomAge;"
"out vec4 fragColor;"
"void main(void)"
"{"
" vec3 Color1 = vec3(1.0, 0.5, 0.5);"
" vec3 Color2 = vec3(0.3, 0.1, 0.1);"
" fragColor = vec4("
" mix(Color1, Color2, geomAge),"
" 1.0 - geomAge"
" );"
"}"
);
// compile it
fs.Compile();
// attach the shaders to the program
prog.AttachShader(vs);
prog.AttachShader(gs);
prog.AttachShader(fs);
// link and use it
prog.Link();
prog.Use();
// bind the VAO for the particles
particles.Bind();
// bind the VBO for the particle positions
pos_buf.Bind(Buffer::Target::Array);
{
Buffer::Data(Buffer::Target::Array, positions, BufferUsage::DynamicDraw);
VertexAttribArray attr(prog, "Position");
attr.Setup(3, DataType::Float);
attr.Enable();
}
// bind the VBO for the particle ages
age_buf.Bind(Buffer::Target::Array);
{
Buffer::Data(Buffer::Target::Array, ages, BufferUsage::DynamicDraw);
VertexAttribArray attr(prog, "Age");
attr.Setup(1, DataType::Float);
attr.Enable();
}
//
gl.ClearColor(0.9f, 0.9f, 0.9f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::Blend);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例3: plane
GlassAndMetalExample(void)
: transf_prog()
, metal_prog()
, plane(transf_prog, shapes::Plane(Vec3f(9, 0, 0), Vec3f(0, 0,-9)))
, torus(transf_prog, shapes::WickerTorus())
, shadow_tex_side(1024)
{
NoProgram().Use();
shadow_pp.Bind();
shadow_pp.UseStages(transf_prog).Vertex();
shadow_pp.UseStages(shadow_prog).Fragment();
light_pp.Bind();
light_pp.UseStages(transf_prog).Vertex();
light_pp.UseStages(light_prog).Fragment();
glass_pp.Bind();
glass_pp.UseStages(transf_prog).Vertex();
glass_pp.UseStages(glass_prog).Fragment();
metal_pp.Bind();
metal_pp.UseStages(transf_prog).Vertex();
metal_pp.UseStages(metal_prog).Fragment();
Texture::Active(0);
metal_prog.metal_tex.Set(0);
gl.Bound(Texture::Target::_2D, metal_texture)
.MinFilter(TextureMinFilter::LinearMipmapLinear)
.MagFilter(TextureMagFilter::Linear)
.WrapS(TextureWrap::Repeat)
.WrapT(TextureWrap::Repeat)
.Image2D(
images::BrushedMetalUByte(
512, 512,
5120,
-3, +3,
32, 128
)
).GenerateMipmap();
Texture::Active(1);
metal_prog.frame_shadow_tex.Set(1);
glass_prog.frame_shadow_tex.Set(1);
gl.Bound(Texture::Target::_2D, frame_shadow_tex)
.MinFilter(TextureMinFilter::Linear)
.MagFilter(TextureMagFilter::Linear)
.WrapS(TextureWrap::ClampToEdge)
.WrapT(TextureWrap::ClampToEdge)
.CompareMode(TextureCompareMode::CompareRefToTexture)
.Image2D(
0,
PixelDataInternalFormat::DepthComponent32,
shadow_tex_side, shadow_tex_side,
0,
PixelDataFormat::DepthComponent,
PixelDataType::Float,
nullptr
);
gl.Bound(Framebuffer::Target::Draw, frame_shadow_fbo)
.AttachTexture(
FramebufferAttachment::Depth,
frame_shadow_tex,
0
);
Texture::Active(2);
metal_prog.glass_shadow_tex.Set(2);
gl.Bound(Texture::Target::_2D, glass_shadow_tex)
.MinFilter(TextureMinFilter::Linear)
.MagFilter(TextureMagFilter::Linear)
.WrapS(TextureWrap::ClampToEdge)
.WrapT(TextureWrap::ClampToEdge)
.Image2D(
0,
PixelDataInternalFormat::RGBA,
shadow_tex_side, shadow_tex_side,
0,
PixelDataFormat::RGBA,
PixelDataType::UnsignedByte,
nullptr
);
gl.Bound(Framebuffer::Target::Draw, glass_shadow_fbo)
.AttachTexture(
FramebufferAttachment::Color,
glass_shadow_tex,
0
);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::CullFace);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
gl.PolygonOffset(1.0, 1.0);
//.........这里部分代码省略.........
示例4: plane
//.........这里部分代码省略.........
, shadow_tex_side(1024)
{
NoProgram().Use();
shadow_pp.Bind();
shadow_pp.UseStages(transf_prog).Vertex();
shadow_pp.UseStages(shadow_prog).Fragment();
sketch_pp.Bind();
sketch_pp.UseStages(transf_prog).Vertex();
sketch_pp.UseStages(sketch_prog).Fragment();
line_pp.Bind();
line_pp.UseStages(transf_prog).Vertex();
line_pp.UseStages(line_prog).Geometry().Fragment();
Texture::Active(0);
sketch_prog.sketch_tex.Set(0);
{
auto bound_tex = gl.Bound(Texture::Target::_3D, sketch_texture);
for(GLuint i=0; i<sketch_tex_layers; ++i)
{
auto image = images::BrushedMetalUByte(
512, 512,
64 + i*128,
-(2+i*4), +(2+i*4),
64, 256-i*4
);
if(i == 0)
{
bound_tex.Image3D(
0,
PixelDataInternalFormat::RGB,
image.Width(),
image.Height(),
sketch_tex_layers,
0,
image.Format(),
image.Type(),
nullptr
);
}
bound_tex.SubImage3D(
0,
0, 0, i,
image.Width(),
image.Height(),
1,
image.Format(),
image.Type(),
image.RawData()
);
}
bound_tex.GenerateMipmap();
bound_tex.MinFilter(TextureMinFilter::LinearMipmapLinear);
bound_tex.MagFilter(TextureMagFilter::Linear);
bound_tex.WrapS(TextureWrap::Repeat);
bound_tex.WrapT(TextureWrap::Repeat);
bound_tex.WrapR(TextureWrap::ClampToEdge);
}
Texture::Active(1);
sketch_prog.shadow_tex.Set(1);
gl.Bound(Texture::Target::_2D, shadow_tex)
.MinFilter(TextureMinFilter::Linear)
.MagFilter(TextureMagFilter::Linear)
.WrapS(TextureWrap::ClampToEdge)
.WrapT(TextureWrap::ClampToEdge)
.CompareMode(TextureCompareMode::CompareRefToTexture)
.Image2D(
0,
PixelDataInternalFormat::DepthComponent32,
shadow_tex_side, shadow_tex_side,
0,
PixelDataFormat::DepthComponent,
PixelDataType::Float,
nullptr
);
gl.Bound(Framebuffer::Target::Draw, frame_shadow_fbo)
.AttachTexture(
FramebufferAttachment::Depth,
shadow_tex,
0
);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::CullFace);
gl.DepthFunc(CompareFn::LEqual);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
gl.PolygonOffset(1.0, 1.0);
gl.LineWidth(1.5);
}
示例5: CloudExample
//.........这里部分代码省略.........
" vec4 v = vec4("
" gl_in[0].gl_Position.xyz+"
" ViewX.xyz * xo[i] * s * 0.5+"
" ViewY.xyz * yo[j] * s * 0.5,"
" 1.0"
" );"
" gl_Position = ProjectionMatrix * CameraMatrix * v;"
" geomLightDir = LightPos - v.xyz;"
" geomTexCoord = "
" vec3(0.5, 0.5, 0.5)+"
" ViewX.xyz*(xo[i])*0.707+"
" ViewY.xyz*(yo[j])*0.707+"
" ViewZ.xyz*(zo )*0.707;"
" EmitVertex();"
" }"
" EndPrimitive();"
"}"
).Compile();
cloud_fs.Source(
"#version 330\n"
"uniform sampler3D CloudTex;"
"in vec3 geomTexCoord;"
"in vec3 geomLightDir;"
"out vec4 fragColor;"
"void main(void)"
"{"
" float d = texture(CloudTex, geomTexCoord).r;"
" float o = 1.0;"
" float s = 2.0/128.0;"
" float r = s * 8.0;"
" vec3 sampleOffs = normalize(geomLightDir) * s;"
" vec3 samplePos = geomTexCoord;"
" if(d > 0.01) while(o > 0.0)"
" {"
" if(samplePos.x<0.0 || samplePos.x>1.0)"
" break;"
" if(samplePos.y<0.0 || samplePos.y>1.0)"
" break;"
" if(samplePos.z<0.0 || samplePos.z>1.0)"
" break;"
" o -= texture(CloudTex, samplePos).r*r;"
" samplePos += sampleOffs;"
" }"
" float a = 0.4 * d;"
" float i = mix(0.2, 1.0, o);"
" fragColor = vec4(i, i, i, a);"
"}"
).Compile();
cloud_prog << cloud_vs << cloud_gs << cloud_fs;
cloud_prog.Link().Use();
// bind the VAO for the clouds
clouds.Bind();
// bind the VBO for the cloud positions
pos_buffer.Bind(Buffer::Target::Array);
{
Buffer::Data(Buffer::Target::Array, positions);
(cloud_prog|"Position").Setup(3, DataType::Float).Enable();
}
// bind the VBO for the cloud sizes
size_buffer.Bind(Buffer::Target::Array);
{
Buffer::Data(Buffer::Target::Array, sizes);
(cloud_prog|"Size").Setup(1, DataType::Float).Enable();
}
// set the number of samples
cloud_prog/"SampleCount" = GLint(samples);
Texture::Active(0);
cloud_prog/"CloudTex" = 0;
for(std::size_t i=0, n=positions.size(); i!=n; ++i)
{
auto bound_tex = Bind(cloud_tex[i], Texture::Target::_3D);
bound_tex.Image3D(
images::Cloud(
128, 128, 128,
Vec3f(0.1f, -0.5f, 0.3f),
0.5f
)
);
bound_tex.GenerateMipmap();
bound_tex.MinFilter(TextureMinFilter::LinearMipmapLinear);
bound_tex.MagFilter(TextureMagFilter::Linear);
bound_tex.BorderColor(Vec4f(0.0f, 0.0f, 0.0f, 0.0f));
bound_tex.WrapS(TextureWrap::ClampToBorder);
bound_tex.WrapT(TextureWrap::ClampToBorder);
bound_tex.WrapR(TextureWrap::ClampToBorder);
}
gl.ClearColor(0.0f, 0.1f, 0.2f, 0.0f);
gl.ClearDepth(1.0f);
gl.Disable(Capability::DepthTest);
gl.Enable(Capability::Blend);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例6: attr
//.........这里部分代码省略.........
attr.Enable();
}
// bind the VBO for the torus UV-coordinates
torus_texcoords.Bind(Buffer::Target::Array);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_torus.TexCoordinates(data);
// upload the data
Buffer::Data(Buffer::Target::Array, data);
// setup the vertex attribs array for the vertices
VertexAttribArray attr(torus_prog, "TexCoord");
attr.Setup(n_per_vertex, DataType::Float);
attr.Enable();
}
const GLchar* plane_vs_source[3] = {
"#version 330\n",
plane_count_def.str().c_str(),
"uniform mat4 ProjectionMatrix, CameraMatrix;"
"uniform float ClipSign[PlaneCount];"
"uniform vec4 ClipPlane[PlaneCount];"
"uniform vec3 Normal;"
"in vec4 Position;"
"out vec3 vertColor;"
"void main(void)"
"{"
" gl_Position = Position;"
" for(int p=0; p!=PlaneCount; ++p)"
" {"
" gl_ClipDistance[p] = "
" ClipSign[p]* "
" dot(ClipPlane[p], gl_Position);"
" }"
" gl_Position = "
" ProjectionMatrix *"
" CameraMatrix *"
" gl_Position;"
" vertColor = normalize("
" abs(Normal) + "
" 0.4*Position.xyz"
" );"
"}"
};
plane_vs.Source(plane_vs_source, 3);
plane_vs.Compile();
plane_fs.Source(
"#version 330\n"
"in vec3 vertColor;"
"out vec4 fragColor;"
"void main(void)"
"{"
" fragColor = vec4(vertColor, 0.7);"
"}"
);
plane_fs.Compile();
plane_prog.AttachShader(plane_vs);
plane_prog.AttachShader(plane_fs);
plane_prog.Link();
plane_prog.Use();
ProgramUniform<Vec4f> torus_clip_plane(torus_prog, "ClipPlane");
ProgramUniform<Vec4f> plane_clip_plane(plane_prog, "ClipPlane");
ProgramUniform<GLfloat> torus_clip_sign(torus_prog, "ClipSign");
ProgramUniform<GLfloat> plane_clip_sign(plane_prog, "ClipSign");
for(std::size_t p=0; p!=plane.size(); ++p)
{
plane[p].Bind();
plane_positions[p].Bind(Buffer::Target::Array);
{
std::vector<GLfloat> data;
GLuint n = make_plane[p].Positions(data);
// upload the data
Buffer::Data(Buffer::Target::Array, data);
VertexAttribArray attr(plane_prog, "Position");
attr.Setup(n, DataType::Float);
attr.Enable();
}
{
auto eq = make_plane[p].Equation();
torus_clip_plane[p].Set(eq);
plane_clip_plane[p].Set(eq);
}
{
torus_clip_signs.push_back(torus_clip_sign[p]);
plane_clip_signs.push_back(plane_clip_sign[p]);
}
}
//
gl.ClearColor(0.8f, 0.8f, 0.7f, 0.0f);
gl.ClearDepth(1.0f);
gl.FrontFace(make_torus.FaceWinding());
gl.Enable(Capability::DepthTest);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例7: attr
//.........这里部分代码省略.........
"void main(void)"
"{"
" float l = dot(vertLight, vertLight);"
" float d = l != 0.0 ? dot("
" vertNormal, "
" normalize(vertLight)"
" ) / l : 0.0;"
" vec3 c = vec3(0.9, 0.8, 0.2);"
" vec4 t = texture(TexUnit, vertTexCoord);"
" float a = 1.0 - sqrt(abs(d)), e;"
" if(gl_FrontFacing)"
" {"
" e = d >= 0.0 ?"
" d * mix(0.5, 1.0, t.a):"
" (-0.9*d) * (1.0 - t.a);"
" }"
" else"
" {"
" e = d >= 0.0 ?"
" (0.6*d) * (1.0 - t.a):"
" (-0.7*d) * mix(0.5, 1.0, t.a);"
" }"
" float i = 0.1 + 9.0*e;"
" fragColor = vec4("
" t.r*c.r*i, "
" t.g*c.g*i, "
" t.b*c.b*i, "
" clamp(pow(t.a,2) + a*0.4, 0.0, 1.0)"
" );"
"}"
);
// compile it
fs.Compile();
// attach the shaders to the program
prog.AttachShader(vs);
prog.AttachShader(fs);
// link and use it
prog.Link();
prog.Use();
// bind the VAO for the cube
cube.Bind();
verts.Bind(Buffer::Target::Array);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.Positions(data);
Buffer::Data(Buffer::Target::Array, data);
VertexAttribArray attr(prog, "Position");
attr.Setup(n_per_vertex, DataType::Float);
attr.Enable();
}
normals.Bind(Buffer::Target::Array);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.Normals(data);
Buffer::Data(Buffer::Target::Array, data);
VertexAttribArray attr(prog, "Normal");
attr.Setup(n_per_vertex, DataType::Float);
attr.Enable();
}
texcoords.Bind(Buffer::Target::Array);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.TexCoordinates(data);
Buffer::Data(Buffer::Target::Array, data);
VertexAttribArray attr(prog, "TexCoord");
attr.Setup(n_per_vertex, DataType::Float);
attr.Enable();
}
// setup the texture
{
auto bound_tex = Bind(tex, Texture::Target::_2D);
bound_tex.Image2D(images::LoadTexture("honeycomb"));
bound_tex.GenerateMipmap();
bound_tex.MinFilter(TextureMinFilter::LinearMipmapLinear);
bound_tex.MagFilter(TextureMagFilter::Linear);
bound_tex.WrapS(TextureWrap::MirroredRepeat);
bound_tex.WrapT(TextureWrap::MirroredRepeat);
}
//
UniformSampler(prog, "TexUnit").Set(0);
Uniform<Vec3f>(prog, "LightPos").Set(Vec3f(1.0f, 2.0f, 3.0f));
//
gl.ClearColor(0.1f, 0.1f, 0.1f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::Blend);
gl.BlendFunc(
BlendFn::SrcAlpha,
BlendFn::OneMinusSrcAlpha
);
gl.Enable(Capability::CullFace);
gl.FrontFace(make_cube.FaceWinding());
}
示例8: attr
//.........这里部分代码省略.........
" mat3(ModelMatrix)*"
" normalize(mix("
" Normal,"
" wrap,"
" mix(0.5, 1.0, vertMult)"
" ));"
" vertNormal = mat3(ModelMatrix)*Normal;"
" vertLight = LightPos-gl_Position.xyz;"
" gl_Position = "
" ProjectionMatrix *"
" CameraMatrix *"
" ScaleMatrix *"
" gl_Position;"
"}"
);
// compile it
vs.Compile();
// set the fragment shader source
fs.Source(
"#version 330\n"
"in float vertMult;"
"in vec3 vertColor;"
"in vec3 vertWrapNormal;"
"in vec3 vertNormal;"
"in vec3 vertLight;"
"out vec4 fragColor;"
"uniform int InstCount;"
"void main(void)"
"{"
" float l = dot(vertLight, vertLight);"
" float d = l > 0.0 ? dot("
" vertNormal, "
" normalize(vertLight)"
" ) / l : 0.0;"
" float s = max("
" dot(vertWrapNormal, vertLight)/l,"
" 0.0"
" );"
" float intensity = clamp("
" 0.2 + d * 3.0 + s * 5.5,"
" 0.0,"
" 1.0"
" );"
" fragColor = vec4("
" abs(vertColor) * intensity,"
" (2.5 + 1.5*d + 1.5*s) / InstCount"
" );"
"}"
);
// compile it
fs.Compile();
// attach the shaders to the program
prog.AttachShader(vs);
prog.AttachShader(fs);
// link and use it
prog.Link();
prog.Use();
// bind the VAO for the cube
cube.Bind();
// bind the VBO for the cube vertices
verts.Bind(Buffer::Target::Array);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.Positions(data);
// upload the data
Buffer::Data(Buffer::Target::Array, data);
// setup the vertex attribs array for the vertices
VertexArrayAttrib attr(prog, "Position");
attr.Setup<GLfloat>(n_per_vertex);
attr.Enable();
}
// bind the VBO for the cube normals
normals.Bind(Buffer::Target::Array);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.Normals(data);
// upload the data
Buffer::Data(Buffer::Target::Array, data);
VertexArrayAttrib attr(prog, "Normal");
attr.Setup<GLfloat>(n_per_vertex);
attr.Enable();
}
// the light position
Uniform<Vec3f>(prog, "LightPos").Set(Vec3f(-3.0f, -2.0f, -3.0f));
// and the instance count
Uniform<GLint>(prog, "InstCount").Set(inst_count);
//
gl.ClearColor(0.5f, 0.6f, 0.5f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::CullFace);
gl.FrontFace(make_cube.FaceWinding());
gl.Enable(Capability::Blend);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例9: vert_attr
//.........这里部分代码省略.........
// link and use it
prog.Link();
prog.Use();
// bind the VAO for the cube
graph.Bind();
std::vector<GLfloat> positions(node_count * 3);
// bind the VBO for the cube vertices
verts.Bind(Buffer::Target::Array);
{
GLuint k = 0;
for(GLuint p=0; p!=node_count; ++p)
{
positions[k++] = nrand() *120.0;
positions[k++] = nrand() * 5.0;
positions[k++] = nrand() *120.0;
}
assert(k == positions.size());
// upload the data
Buffer::Data(Buffer::Target::Array, positions);
// setup the vertex attribs array for the vertices
VertexAttribArray vert_attr(prog, "Position");
vert_attr.Setup(3, DataType::Float).Enable();
}
// bind the VBO for cube edge indices
edges.Bind(Buffer::Target::ElementArray);
{
std::vector<GLuint> edge_data;
edge_data.reserve(node_count * 6);
for(GLuint i=0; i!=node_count; ++i)
{
Vec3f pi(
positions[i*3+0],
positions[i*3+1],
positions[i*3+2]
);
float min_dist = 1000.0f;
GLuint m = i;
for(GLuint j=i+1; j!=node_count; ++j)
{
Vec3f pj(
positions[j*3+0],
positions[j*3+1],
positions[j*3+2]
);
float dist = Distance(pi, pj);
if(min_dist > 1.0 && min_dist > dist)
{
min_dist = dist;
m = j;
}
}
min_dist *= 2.0f;
GLuint done = 0;
for(GLuint j=i+1; j!=node_count; ++j)
{
Vec3f pj(
positions[j*3+0],
positions[j*3+1],
positions[j*3+2]
);
float dist = Distance(pi, pj);
if(min_dist > dist)
{
float x = dist/min_dist;
if(std::pow(nrand(), 2.0) >= x)
{
edge_data.push_back(i);
edge_data.push_back(j);
++done;
}
}
}
if(done == 0)
{
if(i != m)
{
edge_data.push_back(i);
edge_data.push_back(m);
}
}
}
Buffer::Data(Buffer::Target::ElementArray, edge_data);
assert(edge_data.size() % 2 == 0);
edge_count = edge_data.size();
positions.clear();
}
//
gl.ClearColor(0.9f, 0.9f, 0.8f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::LineSmooth);
gl.Enable(Capability::ProgramPointSize);
gl.Enable(Capability::Blend);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例10: attr
//.........这里部分代码省略.........
"in vec2 geomTexCoord;"
"in float geomAge;"
"in float geomLightVal;"
"in float geomLightBias;"
"out vec4 fragColor;"
"void main(void)"
"{"
" vec3 c = texture(SmokeTex, geomTexCoord).rgb;"
" float depth = c.g - c.r;"
" if(depth == 0.0) discard;"
" float density = min(depth * c.b * 2.0, 1.0);"
" float intensity = min("
" max("
" geomLightVal*0.5+"
" geomLightBias,"
" 0.0"
" )+max("
" -geomLightVal*"
" (1.0 - density)*"
" geomLightBias * 5.0,"
" 0.0"
" ),"
" 1.0"
" ) + 0.1;"
" fragColor = vec4("
" intensity,"
" intensity,"
" intensity,"
" (1.0 - geomAge)*density"
" );"
"}"
);
// compile it
fs.Compile();
// attach the shaders to the program
prog.AttachShader(vs);
prog.AttachShader(gs);
prog.AttachShader(fs);
// link and use it
prog.Link();
prog.Use();
// bind the VAO for the particles
particles.Bind();
// bind the VBO for the particle positions
pos_buf.Bind(Buffer::Target::Array);
{
Buffer::Data(Buffer::Target::Array, positions);
VertexAttribArray attr(prog, "Position");
attr.Setup<Vec3f>();
attr.Enable();
}
// bind the VBO for the particle ages
age_buf.Bind(Buffer::Target::Array);
{
Buffer::Data(Buffer::Target::Array, ages);
VertexAttribArray attr(prog, "Age");
attr.Setup<GLfloat>();
attr.Enable();
}
// bind the VBO for the particle identifiers
id_buf.Bind(Buffer::Target::Array);
{
Buffer::Data(Buffer::Target::Array, ids);
VertexAttribArray attr(prog, "Id");
attr.Setup<GLint>();
attr.Enable();
}
Texture::Active(0);
UniformSampler(prog, "SmokeTex").Set(0);
{
auto bound_tex = Bind(smoke_tex, Texture::Target::_2D);
bound_tex.Image2D(
images::Cloud2D(
images::Cloud(
128, 128, 128,
Vec3f(0.1f, -0.5f, 0.3f),
0.5f
)
)
);
bound_tex.GenerateMipmap();
bound_tex.MinFilter(TextureMinFilter::LinearMipmapLinear);
bound_tex.MagFilter(TextureMagFilter::Linear);
bound_tex.BorderColor(Vec4f(0.0f, 0.0f, 0.0f, 0.0f));
bound_tex.WrapS(TextureWrap::ClampToBorder);
bound_tex.WrapT(TextureWrap::ClampToBorder);
}
//
gl.ClearColor(0.0f, 0.1f, 0.2f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::Blend);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例11: shape_attr
//.........这里部分代码省略.........
" EmitVertex();"
" }"
" EndPrimitive();"
"}"
);
light_gs.Compile();
light_fs.Source(
"#version 330\n"
"in vec4 geomPosition;"
"out vec4 fragColor;"
"uniform samplerCubeShadow ShadowMap;"
"uniform int SampleCount;"
"uniform vec3 LightPos;"
"void main(void)"
"{"
" vec3 LightDir = geomPosition.xyz - LightPos;"
" vec4 ShadowCoord = vec4("
" normalize(LightDir),"
" length(LightDir)"
" );"
" float s = texture(ShadowMap, ShadowCoord);"
" float alpha = s / (SampleCount * pow(length(LightDir), 2));"
" fragColor = vec4(1.0, 1.0, 1.0, alpha);"
"}"
);
light_fs.Compile();
light_prog.AttachShader(light_vs);
light_prog.AttachShader(light_gs);
light_prog.AttachShader(light_fs);
light_prog.Link();
light_prog.Use();
// bind the VAO for the light volume
light.Bind();
// bind the VBO for the light volume plane positions
light_positions.Bind(Buffer::Target::Array);
{
GLfloat position[3] = {0.0, 0.0, 0.0};
Buffer::Data(Buffer::Target::Array, 3, position);
VertexAttribArray attr(light_prog, "Position");
attr.Setup(3, DataType::Float);
attr.Enable();
}
Uniform<GLint>(light_prog, "SampleCount").Set(sample_count);
Uniform<GLfloat>(light_prog, "LightVolSize").Set(4);
UniformSampler(light_prog, "ShadowMap").Set(0);
// Setup the texture and the offscreen FBO
Texture::Active(0);
{
auto bound_tex = Bind(depth_tex, Texture::Target::CubeMap);
bound_tex.MinFilter(TextureMinFilter::Linear);
bound_tex.MagFilter(TextureMagFilter::Linear);
bound_tex.WrapS(TextureWrap::ClampToEdge);
bound_tex.WrapT(TextureWrap::ClampToEdge);
bound_tex.WrapR(TextureWrap::ClampToEdge);
bound_tex.CompareFunc(CompareFunction::LEqual);
bound_tex.CompareMode(
TextureCompareMode::CompareRefToTexture
);
for(int i=0; i!=6; ++i)
{
Texture::Image2D(
Texture::CubeMapFace(i),
0,
PixelDataInternalFormat::DepthComponent,
tex_side, tex_side,
0,
PixelDataFormat::DepthComponent,
PixelDataType::Float,
nullptr
);
}
auto bound_fbo = Bind(
depth_fbo,
Framebuffer::Target::Draw
);
bound_fbo.AttachTexture(
FramebufferAttachment::Depth,
depth_tex,
0
);
}
//
gl.ClearColor(0.2f, 0.05f, 0.1f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::CullFace);
gl.FrontFace(make_shape.FaceWinding());
gl.CullFace(Face::Back);
gl.BlendFunc(BlendFunction::SrcAlpha, BlendFunction::One);
}
示例12: attr
//.........这里部分代码省略.........
}
Vec3f lightPos(2.0f, 4.0f, -3.0f);
auto texProjMat =
CamMatrixf::PerspectiveX(Degrees(30), 1.0, 0.3, 20.0) *
CamMatrixf::LookingAt(lightPos, Vec3f(0, 0, 0));
Uniform<GLint>(volume_prog, "SampleCount").Set(samples);
Uniform<GLfloat>(volume_prog, "Size").Set(Length(lightPos));
Uniform<Mat4f>(volume_prog, "TexProjectionMatrix").Set(texProjMat);
plane_vs.Source(
"#version 330\n"
"in vec4 Position;"
"uniform mat4 CameraMatrix, ProjectionMatrix;"
"uniform mat4 TexProjectionMatrix;"
"out vec2 vertChecker;"
"out vec4 vertTexCoord;"
"void main(void)"
"{"
" gl_Position = "
" ProjectionMatrix *"
" CameraMatrix *"
" Position;"
" vertTexCoord = "
" TexProjectionMatrix *"
" Position;"
" vertChecker = Position.xz;"
"}"
);
plane_vs.Compile();
plane_fs.Source(
"#version 330\n"
"uniform sampler2D LightTex;"
"in vec4 vertTexCoord;"
"in vec2 vertChecker;"
"out vec4 fragColor;"
"void main(void)"
"{"
" vec2 coord = vertTexCoord.st/vertTexCoord.q;"
" vec4 t = texture(LightTex, coord*0.5 + 0.5);"
" float i = ("
" 1 +"
" int(vertChecker.x+10) % 2+"
" int(vertChecker.y+10) % 2"
" ) % 2;"
" vec3 color = vec3(0.1, 0.1, 0.1);"
" color += t.rgb * (1.0 - t.a);"
" color *= mix("
" vec3(0.9, 0.9, 1.0), "
" vec3(0.4, 0.4, 0.9), "
" i"
" );"
" fragColor = vec4(color, 1.0);"
"}"
);
plane_fs.Compile();
plane_prog.AttachShader(plane_vs);
plane_prog.AttachShader(plane_fs);
plane_prog.Link();
plane_prog.Use();
Uniform<Mat4f>(plane_prog, "TexProjectionMatrix").Set(texProjMat);
plane.Bind();
// bind the VBO for the plane vertices
plane_pos.Bind(Buffer::Target::Array);
{
GLfloat data[4*3] = {
-9.0f, -4.0f, 9.0f,
-9.0f, -4.0f, -9.0f,
9.0f, -4.0f, 9.0f,
9.0f, -4.0f, -9.0f
};
Buffer::Data(Buffer::Target::Array, 4*3, data);
plane_prog.Use();
VertexArrayAttrib attr(plane_prog, "Position");
attr.Setup<Vec3f>();
attr.Enable();
}
Texture::Active(0);
ProgramUniformSampler(volume_prog, "LightTex").Set(0);
light_tex
<< Texture::Target::_2D
<< TextureMinFilter::LinearMipmapLinear
<< TextureMagFilter::Linear
<< TextureWrap::ClampToBorder
<< Vec4f(0.0f, 0.0f, 0.0f, 0.0f)
<< images::LoadTexture("flower_glass")
<< TextureMipmap();
gl.ClearColor(0.0f, 0.05f, 0.1f, 0.0f);
gl.ClearDepth(1.0f);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::One);
}
示例13: attr
//.........这里部分代码省略.........
" float zoffs = zo *s;"
" vec4 v = vec4("
" gl_in[0].gl_Position.x+xoffs,"
" gl_in[0].gl_Position.y+yoffs,"
" gl_in[0].gl_Position.z+zoffs,"
" 1.0"
" );"
" gl_Position = ProjectionMatrix * v;"
" geomLightDir = LightPos - v.xyz;"
" geomTexCoord = "
" vec3(0.5, 0.5, 0.5)+"
" cx*(xo[i])*0.707+"
" cy*(yo[j])*0.707+"
" cz*(zo )*0.707;"
" EmitVertex();"
" }"
" EndPrimitive();"
" }"
"}"
);
// compile it
gs.Compile();
// set the fragment shader source
fs.Source(
"#version 330\n"
"uniform sampler3D cloudTex;"
"in vec3 geomTexCoord;"
"in vec3 geomLightDir;"
"out vec4 fragColor;"
"void main(void)"
"{"
" float d = texture(cloudTex, geomTexCoord).r;"
" float o = 1.0;"
" float s = 2.0/128.0;"
" float r = s * 8.0;"
" vec3 sampleOffs = normalize(geomLightDir) * s;"
" vec3 samplePos = geomTexCoord;"
" if(d > 0.01) while(o > 0.0)"
" {"
" if(samplePos.x<0.0 || samplePos.x>1.0)"
" break;"
" if(samplePos.y<0.0 || samplePos.y>1.0)"
" break;"
" if(samplePos.z<0.0 || samplePos.z>1.0)"
" break;"
" o -= texture(cloudTex, samplePos).r*r;"
" samplePos += sampleOffs;"
" }"
" float a = 0.2 * d;"
" float i = mix(0.4, 1.0, o);"
" fragColor = vec4(i, i, i, a);"
"}"
);
// compile it
fs.Compile();
// attach the shaders to the program
prog.AttachShader(vs);
prog.AttachShader(gs);
prog.AttachShader(fs);
// link and use it
prog.Link();
prog.Use();
// bind the VAO for the clouds
clouds.Bind();
// bind the VBO for the cloud positions
buffer.Bind(Buffer::Target::Array);
{
GLfloat positions[3] = {0.5f, 0.1f, 0.2f};
Buffer::Data(Buffer::Target::Array, 3, positions);
VertexAttribArray attr(prog, "Position");
attr.Setup(3, DataType::Float);
attr.Enable();
}
{
Texture::Active(0);
UniformSampler(prog, "cloudTex").Set(0);
auto bound_tex = Bind(cloud_tex, Texture::Target::_3D);
bound_tex.Image3D(images::Cloud(128, 128, 128));
bound_tex.GenerateMipmap();
bound_tex.MinFilter(TextureMinFilter::LinearMipmapLinear);
bound_tex.MagFilter(TextureMagFilter::Linear);
bound_tex.BorderColor(Vec4f(0.0f, 0.0f, 0.0f, 0.0f));
bound_tex.WrapS(TextureWrap::ClampToBorder);
bound_tex.WrapT(TextureWrap::ClampToBorder);
bound_tex.WrapR(TextureWrap::ClampToBorder);
}
Uniform<Vec3f>(prog, "LightPos").Set(Vec3f(10.0f, 1.0f, 5.0f));
gl.ClearColor(0.2f, 0.3f, 0.4f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::Blend);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::OneMinusSrcAlpha);
}
示例14: light_attr
FlareExample(void)
: shape(shape_prog, shapes::SpiralSphere())
, n_flares(32)
, queries(n_flares)
{
std::vector<Vec3f> light_positions(n_flares);
for(GLuint i=0; i!=n_flares; ++i)
{
const float rand_max = float(RAND_MAX);
auto angle = FullCircles(std::rand()/rand_max);
light_positions[i] = Vec3f(
7.0f*Cos(angle),
0.2f*(std::rand()/rand_max)-0.1f,
7.0f*Sin(angle)
);
}
shape_prog.light_position.Set(light_positions);
shape_prog.color_1 = Vec3f(0.3f, 0.3f, 0.5f);
shape_prog.color_2 = Vec3f(0.8f, 0.8f, 1.0f);
Texture::Active(0);
shape_prog.metal_tex.Set(0);
metal_texture
<< TextureTarget::_2D
<< TextureMinFilter::LinearMipmapLinear
<< TextureMagFilter::Linear
<< TextureWrap::Repeat
<< images::BrushedMetalUByte(
512, 512,
5120,
-12, +12,
32, 64
)
<< TextureMipmap();
Texture::Active(1);
UniformSampler(flare_prog, "FlareTex").Set(1);
flare_texture
<< TextureTarget::_2D
<< TextureMinFilter::LinearMipmapLinear
<< TextureMagFilter::Linear
<< images::LoadTexture("flare_1")
<< TextureMipmap();
(TextureTarget::_2D|0) << TextureWrap::MirroredRepeat;
(TextureTarget::_2D|1) << TextureWrap::Repeat;
lights.Bind();
try
{
light_pos.Bind(Buffer::Target::Array);
Buffer::Data(Buffer::Target::Array, light_positions);
light_prog.Use();
VertexArrayAttrib light_attr(light_prog, "Position");
light_attr.Setup<Vec3f>();
light_attr.Enable();
flare_prog.Use();
VertexArrayAttrib flare_attr(flare_prog, "Position");
flare_attr.Setup<Vec3f>();
flare_attr.Enable();
}
catch(Error&)
{ }
gl.ClearColor(0.1f, 0.1f, 0.1f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::ProgramPointSize);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::CullFace);
gl.CullFace(Face::Back);
gl.BlendFunc(BlendFn::SrcAlpha, BlendFn::One);
}
示例15: attr
CubeExample(void)
: cube_instr(make_cube.Instructions())
, cube_indices(make_cube.Indices())
, prog(make_prog())
, projection_matrix(prog, "ProjectionMatrix")
, camera_matrix(prog, "CameraMatrix")
, model_matrix(prog, "ModelMatrix")
{
// bind the VAO for the cube
gl.Bind(cube);
gl.Bind(Buffer::Target::Array, verts);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.Positions(data);
Buffer::Data(Buffer::Target::Array, data);
VertexArrayAttrib attr(prog, "Position");
attr.Setup<GLfloat>(n_per_vertex);
attr.Enable();
}
gl.Bind(Buffer::Target::Array, normals);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.Normals(data);
Buffer::Data(Buffer::Target::Array, data);
VertexArrayAttrib attr(prog, "Normal");
attr.Setup<GLfloat>(n_per_vertex);
attr.Enable();
}
gl.Bind(Buffer::Target::Array, texcoords);
{
std::vector<GLfloat> data;
GLuint n_per_vertex = make_cube.TexCoordinates(data);
Buffer::Data(Buffer::Target::Array, data);
VertexArrayAttrib attr(prog, "TexCoord");
attr.Setup<GLfloat>(n_per_vertex);
attr.Enable();
}
// setup the texture
gl.Bound(Texture::Target::_2D, tex)
.Image2D(images::LoadTexture("honeycomb"))
.GenerateMipmap()
.MinFilter(TextureMinFilter::LinearMipmapLinear)
.MagFilter(TextureMagFilter::Linear)
.WrapS(TextureWrap::MirroredRepeat)
.WrapT(TextureWrap::MirroredRepeat)
.Anisotropy(2);
//
UniformSampler(prog, "TexUnit").Set(0);
Uniform<Vec3f>(prog, "LightPos").Set(Vec3f(1.0f, 2.0f, 3.0f));
//
gl.ClearColor(0.1f, 0.1f, 0.1f, 0.0f);
gl.ClearDepth(1.0f);
gl.Enable(Capability::DepthTest);
gl.Enable(Capability::Blend);
gl.BlendFunc(
BlendFn::SrcAlpha,
BlendFn::OneMinusSrcAlpha
);
gl.Enable(Capability::CullFace);
gl.FrontFace(make_cube.FaceWinding());
}