本文整理汇总了C++中GLProgramUniform::SetValue方法的典型用法代码示例。如果您正苦于以下问题:C++ GLProgramUniform::SetValue方法的具体用法?C++ GLProgramUniform::SetValue怎么用?C++ GLProgramUniform::SetValue使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GLProgramUniform
的用法示例。
在下文中一共展示了GLProgramUniform::SetValue方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GaussianBlur
GLColorBuffer GLLensDustFilter::GaussianBlur(GLColorBuffer tex, bool vertical) {
SPADES_MARK_FUNCTION();
GLProgram *program = gauss1d;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
int w = tex.GetWidth();
int h = tex.GetHeight();
static GLProgramAttribute blur_positionAttribute("positionAttribute");
static GLProgramUniform blur_textureUniform("mainTexture");
static GLProgramUniform blur_unitShift("unitShift");
program->Use();
blur_positionAttribute(program);
blur_textureUniform(program);
blur_textureUniform.SetValue(0);
dev->ActiveTexture(0);
dev->BindTexture(IGLDevice::Texture2D, tex.GetTexture());
blur_unitShift(program);
blur_unitShift.SetValue(vertical ? 0.f : 1.f / w,
vertical ? 1.f / h : 0.f);
qr.SetCoordAttributeIndex(blur_positionAttribute());
dev->Enable(IGLDevice::Blend, false);
GLColorBuffer buf2 = renderer->GetFramebufferManager()->CreateBufferHandle(w, h, false);
dev->Viewport(0, 0, buf2.GetWidth(), buf2.GetHeight());
dev->BindFramebuffer(IGLDevice::Framebuffer, buf2.GetFramebuffer());
qr.Draw();
return buf2;
}
示例2: Blur
GLColorBuffer GLDepthOfFieldFilter::Blur(GLColorBuffer buffer,
GLColorBuffer coc,
Vector2 offset,
int divide) {
SPADES_MARK_FUNCTION();
// do gaussian blur
GLProgram *program = blurProgram;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
int w = buffer.GetWidth();
int h = buffer.GetHeight();
int w2 = w / divide;
int h2 = h / divide;
static GLProgramAttribute blur_positionAttribute("positionAttribute");
static GLProgramUniform blur_textureUniform("texture");
static GLProgramUniform blur_cocUniform("cocTexture");
static GLProgramUniform blur_offset("offset");
program->Use();
blur_positionAttribute(program);
blur_textureUniform(program);
blur_cocUniform(program);
blur_offset(program);
blur_cocUniform.SetValue(1);
dev->ActiveTexture(1);
dev->BindTexture(IGLDevice::Texture2D, coc.GetTexture());
blur_textureUniform.SetValue(0);
dev->ActiveTexture(0);
qr.SetCoordAttributeIndex(blur_positionAttribute());
// x-direction
float len = offset.GetLength();
float sX = 1.f / (float)w, sY = 1.f / (float)h;
while(len > .5f){
GLColorBuffer buf2 = renderer->GetFramebufferManager()->CreateBufferHandle(w2, h2, false);
dev->BindFramebuffer(IGLDevice::Framebuffer, buf2.GetFramebuffer());
dev->BindTexture(IGLDevice::Texture2D, buffer.GetTexture());
blur_offset.SetValue(offset.x * sX, offset.y * sY);
qr.Draw();
buffer = buf2;
offset *= .125f;
len *= .125f;
}
return buffer;
}
示例3: FinalMix
GLColorBuffer GLDepthOfFieldFilter::FinalMix(GLColorBuffer tex,
GLColorBuffer blur1,
GLColorBuffer blur2,
GLColorBuffer coc) {
SPADES_MARK_FUNCTION();
// do gaussian blur
GLProgram *program = finalMix;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
int w = tex.GetWidth();
int h = tex.GetHeight();
static GLProgramAttribute blur_positionAttribute("positionAttribute");
static GLProgramUniform blur_textureUniform1("texture");
static GLProgramUniform blur_textureUniform2("blurTexture1");
static GLProgramUniform blur_textureUniform3("blurTexture2");
static GLProgramUniform blur_textureUniform4("cocTexture");
program->Use();
blur_positionAttribute(program);
blur_textureUniform1(program);
blur_textureUniform1.SetValue(3);
dev->ActiveTexture(3);
dev->BindTexture(IGLDevice::Texture2D, tex.GetTexture());
blur_textureUniform2(program);
blur_textureUniform2.SetValue(2);
dev->ActiveTexture(2);
dev->BindTexture(IGLDevice::Texture2D, blur1.GetTexture());
blur_textureUniform3(program);
blur_textureUniform3.SetValue(1);
dev->ActiveTexture(1);
dev->BindTexture(IGLDevice::Texture2D, blur2.GetTexture());
blur_textureUniform4(program);
blur_textureUniform4.SetValue(0);
dev->ActiveTexture(0);
dev->BindTexture(IGLDevice::Texture2D, coc.GetTexture());
qr.SetCoordAttributeIndex(blur_positionAttribute());
dev->Enable(IGLDevice::Blend, false);
// x-direction
GLColorBuffer buf2 = renderer->GetFramebufferManager()->CreateBufferHandle(w, h, false);
dev->BindFramebuffer(IGLDevice::Framebuffer, buf2.GetFramebuffer());
qr.Draw();
return buf2;
}
示例4: DownSample
GLColorBuffer GLLensDustFilter::DownSample(GLColorBuffer tex,
bool linearize) {
SPADES_MARK_FUNCTION();
GLProgram *program = thru;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
int w = tex.GetWidth();
int h = tex.GetHeight();
static GLProgramAttribute blur_positionAttribute("positionAttribute");
static GLProgramUniform blur_textureUniform("mainTexture");
static GLProgramUniform blur_colorUniform("colorUniform");
static GLProgramUniform blur_texCoordRangeUniform("texCoordRange");
static GLProgramUniform blur_texCoordOffsetUniform("texCoordOffset");
program->Use();
blur_positionAttribute(program);
blur_textureUniform(program);
blur_textureUniform.SetValue(0);
dev->ActiveTexture(0);
dev->BindTexture(IGLDevice::Texture2D, tex.GetTexture());
blur_texCoordOffsetUniform(program);
blur_texCoordOffsetUniform.SetValue(1.f / w, 1.f / h, -1.f / w, -1.f / h);
blur_colorUniform(program);
blur_colorUniform.SetValue(1.f,1.f,1.f,1.f);
blur_texCoordRangeUniform(program);
blur_texCoordRangeUniform.SetValue(0.f, 0.f,
(float)((w + 1) & ~1) / w,
(float)((h + 1) & ~1) / h);
qr.SetCoordAttributeIndex(blur_positionAttribute());
if(linearize){
dev->Enable(IGLDevice::Blend, true);
dev->BlendFunc(IGLDevice::SrcColor,
IGLDevice::Zero);
}else{
dev->Enable(IGLDevice::Blend, false);
}
GLColorBuffer buf2 = renderer->GetFramebufferManager()->CreateBufferHandle((w+1)/2, (h+1)/2, false);
dev->Viewport(0, 0, buf2.GetWidth(), buf2.GetHeight());
dev->BindFramebuffer(IGLDevice::Framebuffer, buf2.GetFramebuffer());
qr.Draw();
return buf2;
}
示例5: AddMix
GLColorBuffer GLDepthOfFieldFilter::AddMix(GLColorBuffer buffer1, GLColorBuffer buffer2) {
SPADES_MARK_FUNCTION();
// do gaussian blur
GLProgram *program = gammaMix;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
int w = buffer1.GetWidth();
int h = buffer1.GetHeight();
static GLProgramAttribute blur_positionAttribute("positionAttribute");
static GLProgramUniform blur_textureUniform1("texture1");
static GLProgramUniform blur_textureUniform2("texture2");
static GLProgramUniform blur_unitShift("unitShift");
static GLProgramUniform blur_mix1("mix1");
static GLProgramUniform blur_mix2("mix2");
program->Use();
blur_positionAttribute(program);
blur_textureUniform1(program);
blur_textureUniform1.SetValue(1);
dev->ActiveTexture(1);
dev->BindTexture(IGLDevice::Texture2D, buffer1.GetTexture());
blur_textureUniform2(program);
blur_textureUniform2.SetValue(0);
dev->ActiveTexture(0);
dev->BindTexture(IGLDevice::Texture2D, buffer2.GetTexture());
blur_mix1(program);
blur_mix2(program);
blur_mix1.SetValue(.5f, .5f, .5f);
blur_mix2.SetValue(.5f, .5f, .5f);
qr.SetCoordAttributeIndex(blur_positionAttribute());
dev->Enable(IGLDevice::Blend, false);
// x-direction
GLColorBuffer buf2 = renderer->GetFramebufferManager()->CreateBufferHandle(w, h, false);
dev->BindFramebuffer(IGLDevice::Framebuffer, buf2.GetFramebuffer());
qr.Draw();
return buf2;
}
示例6: Filter
GLColorBuffer GLLensFilter::Filter(GLColorBuffer input) {
SPADES_MARK_FUNCTION();
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
static GLProgramAttribute lensPosition("positionAttribute");
static GLProgramUniform lensTexture("mainTexture");
static GLProgramUniform lensFov("fov");
dev->Enable(IGLDevice::Blend, false);
lensPosition(lens);
lensTexture(lens);
lensFov(lens);
lens->Use();
client::SceneDefinition def = renderer->GetSceneDef();
lensFov.SetValue(tanf(def.fovX * .5f),
tanf(def.fovY * .5f));
lensTexture.SetValue(0);
// composite to the final image
GLColorBuffer output = input.GetManager()->CreateBufferHandle();
qr.SetCoordAttributeIndex(lensPosition());
dev->BindTexture(IGLDevice::Texture2D, input.GetTexture());
dev->BindFramebuffer(IGLDevice::Framebuffer, output.GetFramebuffer());
dev->Viewport(0, 0, output.GetWidth(), output.GetHeight());
qr.Draw();
dev->BindTexture(IGLDevice::Texture2D, 0);
return output;
}
示例7: UnderSample
GLColorBuffer GLDepthOfFieldFilter::UnderSample(GLColorBuffer tex) {
SPADES_MARK_FUNCTION();
// do gaussian blur
GLProgram *program = passthrough;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
int w = tex.GetWidth();
int h = tex.GetHeight();
static GLProgramAttribute blur_positionAttribute("positionAttribute");
static GLProgramUniform blur_textureUniform("texture");
static GLProgramUniform blur_colorUniform("colorUniform");
static GLProgramUniform blur_texCoordRangeUniform("texCoordRange");
program->Use();
blur_positionAttribute(program);
blur_textureUniform(program);
blur_textureUniform.SetValue(0);
dev->ActiveTexture(0);
dev->BindTexture(IGLDevice::Texture2D, tex.GetTexture());
blur_colorUniform(program);
blur_colorUniform.SetValue(1.f,1.f,1.f,1.f);
blur_texCoordRangeUniform(program);
blur_texCoordRangeUniform.SetValue(0.f, 0.f, 1.f, 1.f);
qr.SetCoordAttributeIndex(blur_positionAttribute());
dev->Enable(IGLDevice::Blend, false);
GLColorBuffer buf2 = renderer->GetFramebufferManager()->CreateBufferHandle(w/2, h/2, false);
dev->Viewport(0, 0, w/2, h/2);
dev->BindFramebuffer(IGLDevice::Framebuffer, buf2.GetFramebuffer());
qr.Draw();
return buf2;
}
示例8: Filter
GLColorBuffer GLCameraBlurFilter::Filter(GLColorBuffer input, float radialBlur) {
SPADES_MARK_FUNCTION();
if(radialBlur > 0.f)
radialBlur = 1.f - radialBlur;
else
radialBlur = 1.f;
bool hasRadialBlur = radialBlur < .9999f;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
dev->Enable(IGLDevice::Blend, false);
static GLProgramAttribute programPosition("positionAttribute");
static GLProgramUniform programTexture("texture");
static GLProgramUniform programDepthTexture("depthTexture");
static GLProgramUniform programReverseMatrix("reverseMatrix");
static GLProgramUniform programShutterTimeScale("shutterTimeScale");
programPosition(program);
programTexture(program);
programDepthTexture(program);
programReverseMatrix(program);
programShutterTimeScale(program);
const client::SceneDefinition& def = renderer->GetSceneDef();
Matrix4 newMatrix = Matrix4::Identity();
newMatrix.m[0] = def.viewAxis[0].x;
newMatrix.m[1] = def.viewAxis[1].x;
newMatrix.m[2] = def.viewAxis[2].x;
newMatrix.m[4] = def.viewAxis[0].y;
newMatrix.m[5] = def.viewAxis[1].y;
newMatrix.m[6] = def.viewAxis[2].y;
newMatrix.m[8] = def.viewAxis[0].z;
newMatrix.m[9] = def.viewAxis[1].z;
newMatrix.m[10] = def.viewAxis[2].z;
// othrogonal matrix can be reversed fast
Matrix4 inverseNewMatrix = newMatrix.Transposed();
Matrix4 diffMatrix = prevMatrix * inverseNewMatrix;
prevMatrix = newMatrix;
Matrix4 reverseMatrix = ReverseMatrix(diffMatrix);
if(diffMatrix.m[0] < .3f ||
diffMatrix.m[5] < .3f ||
diffMatrix.m[10] < .3f){
// too much change
if(hasRadialBlur) {
diffMatrix = Matrix4::Identity();
}else{
// skip blur
return input;
}
}
float movePixels = MyACos(diffMatrix.m[0]);
float shutterTimeScale = .3f;
movePixels = std::max(movePixels, MyACos(diffMatrix.m[5]));
movePixels = std::max(movePixels, MyACos(diffMatrix.m[10]));
movePixels = tanf(movePixels) / tanf(def.fovX * .5f);
movePixels *= (float)dev->ScreenWidth() * .5f;
movePixels *= shutterTimeScale;
movePixels = std::max(movePixels,
(1.f - radialBlur) * dev->ScreenWidth() * 0.5f);
if(movePixels < 1.f){
// too less change, skip camera blur
return input;
}
int levels = (int)ceilf(logf(movePixels) / logf(5.f));
if(levels <= 0)
levels = 1;
if(hasRadialBlur)
radialBlur *= radialBlur;
reverseMatrix = Matrix4::Scale(radialBlur, radialBlur, 1.f)
* reverseMatrix;
program->Use();
programTexture.SetValue(0);
programDepthTexture.SetValue(1);
programReverseMatrix.SetValue(reverseMatrix);
// composite to the final image
GLColorBuffer buf = input;
qr.SetCoordAttributeIndex(programPosition());
dev->ActiveTexture(1);
dev->BindTexture(IGLDevice::Texture2D, renderer->GetFramebufferManager()->GetDepthTexture());
dev->ActiveTexture(0);
for(int i = 0; i < levels; i++){
GLProfiler measure(dev, "Apply [%d / %d]", i+1,levels);
//.........这里部分代码省略.........
示例9: Filter
GLColorBuffer GLLensDustFilter::Filter(GLColorBuffer input) {
SPADES_MARK_FUNCTION();
UpdateNoise();
std::vector<Level> levels;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
static GLProgramAttribute thruPosition("positionAttribute");
static GLProgramUniform thruColor("colorUniform");
static GLProgramUniform thruTexture("mainTexture");
static GLProgramUniform thruTexCoordRange("texCoordRange");
thruPosition(thru);
thruColor(thru);
thruTexture(thru);
thruTexCoordRange(thru);
GLColorBuffer downSampled = DownSample(input, r_hdr ? false : true);
downSampled = GaussianBlur(downSampled, false);
downSampled = GaussianBlur(downSampled, true);
thru->Use();
thruColor.SetValue(1.f, 1.f, 1.f, 1.f);
thruTexture.SetValue(0);
dev->Enable(IGLDevice::Blend, false);
levels.reserve(10);
// create downsample levels
for(int i = 0; i < 10; i++){
GLColorBuffer prevLevel;
if(i == 0){
prevLevel = downSampled;
}else{
prevLevel = levels.back().buffer;
}
int prevW = prevLevel.GetWidth();
int prevH = prevLevel.GetHeight();
int newW = (prevW + 1) / 2;
int newH = (prevH + 1) / 2;
if(newW <= 1 || newH <= 1)
break;
GLColorBuffer newLevel = DownSample(prevLevel);
newLevel = GaussianBlur(newLevel, false);
newLevel = GaussianBlur(newLevel, true);
Level lv;
lv.w = newW; lv.h = newH;
lv.buffer = newLevel;
levels.push_back(lv);
}
dev->Enable(IGLDevice::Blend, true);
dev->BlendFunc(IGLDevice::SrcAlpha,
IGLDevice::OneMinusSrcAlpha);
// composite levels in the opposite direction
thru->Use();
qr.SetCoordAttributeIndex(thruPosition());
for(int i = (int)levels.size() - 1; i >= 1; i--){
int cnt = (int)levels.size() - i;
float alpha = (float)cnt / (float)(cnt + 1);
alpha = alpha;
GLColorBuffer curLevel = levels[i].buffer;
float sx = .25f / curLevel.GetWidth();
float sy = .25f / curLevel.GetHeight();
for(int j = 0; j < 4; j++) {
if(i < (int)levels.size() - 1) {
curLevel = levels[i].retBuf[j];
}
GLColorBuffer targLevel = levels[i - 1].buffer;
GLColorBuffer targRet = input.GetManager()->CreateBufferHandle(targLevel.GetWidth(),
targLevel.GetHeight(),
false);
levels[i - 1].retBuf[j] = targRet;
dev->BindFramebuffer(IGLDevice::Framebuffer, targRet.GetFramebuffer());
dev->Viewport(0, 0, targRet.GetWidth(), targRet.GetHeight());
dev->BindTexture(IGLDevice::Texture2D, targLevel.GetTexture());
thruColor.SetValue(1.f, 1.f, 1.f, 1.f);
thruTexCoordRange.SetValue(0.f, 0.f, 1.f, 1.f);
dev->Enable(IGLDevice::Blend, false);
qr.Draw();
float cx = 0.f, cy = 0.f;
switch(j){
case 0: cx = sx; break;
case 1: cx = -sx; break;
case 2: cy = sy; break;
case 3: cy = -sy; break;
}
//.........这里部分代码省略.........
示例10: Filter
GLColorBuffer GLBloomFilter::Filter(GLColorBuffer input) {
SPADES_MARK_FUNCTION();
std::vector<Level> levels;
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
static GLProgramAttribute thruPosition("positionAttribute");
static GLProgramUniform thruColor("colorUniform");
static GLProgramUniform thruTexture("texture");
static GLProgramUniform thruTexCoordRange("texCoordRange");
thruPosition(thru);
thruColor(thru);
thruTexture(thru);
thruTexCoordRange(thru);
GLProgram *gammaMix = renderer->RegisterProgram("Shaders/PostFilters/GammaMix.program");
static GLProgramAttribute gammaMixPosition("positionAttribute");
static GLProgramUniform gammaMixTexture1("texture1");
static GLProgramUniform gammaMixTexture2("texture2");
static GLProgramUniform gammaMixMix1("mix1");
static GLProgramUniform gammaMixMix2("mix2");
gammaMixPosition(gammaMix);
gammaMixTexture1(gammaMix);
gammaMixTexture2(gammaMix);
gammaMixMix1(gammaMix);
gammaMixMix2(gammaMix);
thru->Use();
thruColor.SetValue(1.f, 1.f, 1.f, 1.f);
thruTexture.SetValue(0);
dev->Enable(IGLDevice::Blend, false);
// create downsample levels
for(int i = 0; i < 6; i++){
GLColorBuffer prevLevel;
if(i == 0){
prevLevel = input;
}else{
prevLevel = levels.back().buffer;
}
int prevW = prevLevel.GetWidth();
int prevH = prevLevel.GetHeight();
int newW = (prevW + 1) / 2;
int newH = (prevH + 1) / 2;
GLColorBuffer newLevel = input.GetManager()->CreateBufferHandle(newW, newH);
thru->Use();
qr.SetCoordAttributeIndex(thruPosition());
dev->BindTexture(IGLDevice::Texture2D, prevLevel.GetTexture());
dev->BindFramebuffer(IGLDevice::Framebuffer, newLevel.GetFramebuffer());
dev->Viewport(0, 0, newLevel.GetWidth(), newLevel.GetHeight());
thruTexCoordRange.SetValue(0.f, 0.f,
(float)newLevel.GetWidth() * 2.f / (float)prevW,
(float)newLevel.GetHeight() * 2.f / (float)prevH);
qr.Draw();
dev->BindTexture(IGLDevice::Texture2D, 0);
Level lv;
lv.w = newW; lv.h = newH;
lv.buffer = newLevel;
levels.push_back(lv);
}
dev->Enable(IGLDevice::Blend, true);
dev->BlendFunc(IGLDevice::SrcAlpha,
IGLDevice::OneMinusSrcAlpha);
// composite levels in the opposite direction
thruTexCoordRange.SetValue(0.f, 0.f, 1.f, 1.f);
for(int i = (int)levels.size() - 1; i >= 1; i--){
int cnt = (int)levels.size() - i;
float alpha = (float)cnt / (float)(cnt + 1);
alpha = sqrtf(alpha);
GLColorBuffer curLevel = levels[i].buffer;
GLColorBuffer targLevel = levels[i - 1].buffer;
thru->Use();
qr.SetCoordAttributeIndex(thruPosition());
dev->BindTexture(IGLDevice::Texture2D, curLevel.GetTexture());
dev->BindFramebuffer(IGLDevice::Framebuffer, targLevel.GetFramebuffer());
dev->Viewport(0, 0, targLevel.GetWidth(), targLevel.GetHeight());
thruColor.SetValue(1.f, 1.f, 1.f, alpha);
qr.Draw();
dev->BindTexture(IGLDevice::Texture2D, 0);
}
// composite to the final image
GLColorBuffer output = input.GetManager()->CreateBufferHandle();
GLColorBuffer topLevel = levels[0].buffer;
gammaMix->Use();
qr.SetCoordAttributeIndex(gammaMixPosition());
dev->ActiveTexture(0);
//.........这里部分代码省略.........
示例11: RenderDynamicLightPass
void GLVoxelModel::RenderDynamicLightPass(std::vector<client::ModelRenderParam> params,
std::vector<GLDynamicLight> lights) {
SPADES_MARK_FUNCTION();
device->ActiveTexture(0);
device->Enable(IGLDevice::CullFace, true);
device->Enable(IGLDevice::DepthTest, true);
dlightProgram->Use();
static GLDynamicLightShader dlightShader;
static GLProgramUniform fogDistance("fogDistance");
fogDistance(dlightProgram);
fogDistance.SetValue(renderer->GetFogDistance());
static GLProgramUniform modelOrigin("modelOrigin");
modelOrigin(dlightProgram);
modelOrigin.SetValue(origin.x, origin.y, origin.z);
static GLProgramUniform sunLightDirection("sunLightDirection");
sunLightDirection(dlightProgram);
Vector3 sunPos = MakeVector3(0, -1, -1);
sunPos = sunPos.Normalize();
sunLightDirection.SetValue(sunPos.x, sunPos.y, sunPos.z);
static GLProgramUniform viewOriginVector("viewOriginVector");
viewOriginVector(dlightProgram);
const auto &viewOrigin = renderer->GetSceneDef().viewOrigin;
viewOriginVector.SetValue(viewOrigin.x, viewOrigin.y, viewOrigin.z);
// setup attributes
static GLProgramAttribute positionAttribute("positionAttribute");
static GLProgramAttribute colorAttribute("colorAttribute");
static GLProgramAttribute normalAttribute("normalAttribute");
positionAttribute(dlightProgram);
colorAttribute(dlightProgram);
normalAttribute(dlightProgram);
device->BindBuffer(IGLDevice::ArrayBuffer, buffer);
device->VertexAttribPointer(positionAttribute(), 4, IGLDevice::UnsignedByte, false,
sizeof(Vertex), (void *)0);
device->VertexAttribPointer(colorAttribute(), 4, IGLDevice::UnsignedByte, true,
sizeof(Vertex), (void *)8);
device->VertexAttribPointer(normalAttribute(), 3, IGLDevice::Byte, false,
sizeof(Vertex), (void *)12);
device->BindBuffer(IGLDevice::ArrayBuffer, 0);
device->EnableVertexAttribArray(positionAttribute(), true);
device->EnableVertexAttribArray(colorAttribute(), true);
device->EnableVertexAttribArray(normalAttribute(), true);
device->BindBuffer(IGLDevice::ElementArrayBuffer, idxBuffer);
for (size_t i = 0; i < params.size(); i++) {
const client::ModelRenderParam ¶m = params[i];
// frustrum cull
float rad = radius;
rad *= param.matrix.GetAxis(0).GetLength();
if (!renderer->SphereFrustrumCull(param.matrix.GetOrigin(), rad)) {
continue;
}
static GLProgramUniform customColor("customColor");
customColor(dlightProgram);
customColor.SetValue(param.customColor.x, param.customColor.y, param.customColor.z);
Matrix4 modelMatrix = param.matrix;
static GLProgramUniform projectionViewModelMatrix("projectionViewModelMatrix");
projectionViewModelMatrix(dlightProgram);
projectionViewModelMatrix.SetValue(renderer->GetProjectionViewMatrix() *
modelMatrix);
static GLProgramUniform viewModelMatrix("viewModelMatrix");
viewModelMatrix(dlightProgram);
viewModelMatrix.SetValue(renderer->GetViewMatrix() * modelMatrix);
static GLProgramUniform modelMatrixU("modelMatrix");
modelMatrixU(dlightProgram);
modelMatrixU.SetValue(modelMatrix);
modelMatrix.m[12] = 0.f;
modelMatrix.m[13] = 0.f;
modelMatrix.m[14] = 0.f;
static GLProgramUniform modelNormalMatrix("modelNormalMatrix");
modelNormalMatrix(dlightProgram);
modelNormalMatrix.SetValue(modelMatrix);
if (param.depthHack) {
device->DepthRange(0.f, 0.1f);
}
for (size_t i = 0; i < lights.size(); i++) {
if (!GLDynamicLightShader::SphereCull(lights[i], param.matrix.GetOrigin(), rad))
continue;
dlightShader(renderer, dlightProgram, lights[i], 0);
//.........这里部分代码省略.........
示例12: RenderSunlightPass
void GLVoxelModel::RenderSunlightPass(std::vector<client::ModelRenderParam> params) {
SPADES_MARK_FUNCTION();
device->ActiveTexture(0);
aoImage->Bind(IGLDevice::Texture2D);
device->TexParamater(IGLDevice::Texture2D, IGLDevice::TextureMinFilter,
IGLDevice::Linear);
device->Enable(IGLDevice::CullFace, true);
device->Enable(IGLDevice::DepthTest, true);
program->Use();
static GLShadowShader shadowShader;
shadowShader(renderer, program, 1);
static GLProgramUniform fogDistance("fogDistance");
fogDistance(program);
fogDistance.SetValue(renderer->GetFogDistance());
static GLProgramUniform fogColor("fogColor");
fogColor(program);
Vector3 fogCol = renderer->GetFogColorForSolidPass();
fogCol *= fogCol;
fogColor.SetValue(fogCol.x, fogCol.y, fogCol.z);
static GLProgramUniform aoUniform("ambientOcclusionTexture");
aoUniform(program);
aoUniform.SetValue(0);
static GLProgramUniform modelOrigin("modelOrigin");
modelOrigin(program);
modelOrigin.SetValue(origin.x, origin.y, origin.z);
static GLProgramUniform sunLightDirection("sunLightDirection");
sunLightDirection(program);
Vector3 sunPos = MakeVector3(0, -1, -1);
sunPos = sunPos.Normalize();
sunLightDirection.SetValue(sunPos.x, sunPos.y, sunPos.z);
static GLProgramUniform viewOriginVector("viewOriginVector");
viewOriginVector(program);
const auto &viewOrigin = renderer->GetSceneDef().viewOrigin;
viewOriginVector.SetValue(viewOrigin.x, viewOrigin.y, viewOrigin.z);
// setup attributes
static GLProgramAttribute positionAttribute("positionAttribute");
static GLProgramAttribute textureCoordAttribute("textureCoordAttribute");
static GLProgramAttribute colorAttribute("colorAttribute");
static GLProgramAttribute normalAttribute("normalAttribute");
positionAttribute(program);
textureCoordAttribute(program);
colorAttribute(program);
normalAttribute(program);
device->BindBuffer(IGLDevice::ArrayBuffer, buffer);
device->VertexAttribPointer(positionAttribute(), 4, IGLDevice::UnsignedByte, false,
sizeof(Vertex), (void *)0);
device->VertexAttribPointer(textureCoordAttribute(), 2, IGLDevice::UnsignedShort, false,
sizeof(Vertex), (void *)4);
device->VertexAttribPointer(colorAttribute(), 4, IGLDevice::UnsignedByte, true,
sizeof(Vertex), (void *)8);
device->VertexAttribPointer(normalAttribute(), 3, IGLDevice::Byte, false,
sizeof(Vertex), (void *)12);
device->BindBuffer(IGLDevice::ArrayBuffer, 0);
device->EnableVertexAttribArray(positionAttribute(), true);
device->EnableVertexAttribArray(textureCoordAttribute(), true);
device->EnableVertexAttribArray(colorAttribute(), true);
device->EnableVertexAttribArray(normalAttribute(), true);
device->BindBuffer(IGLDevice::ElementArrayBuffer, idxBuffer);
for (size_t i = 0; i < params.size(); i++) {
const client::ModelRenderParam ¶m = params[i];
// frustrum cull
float rad = radius;
rad *= param.matrix.GetAxis(0).GetLength();
if (!renderer->SphereFrustrumCull(param.matrix.GetOrigin(), rad)) {
continue;
}
static GLProgramUniform customColor("customColor");
customColor(program);
customColor.SetValue(param.customColor.x, param.customColor.y, param.customColor.z);
Matrix4 modelMatrix = param.matrix;
static GLProgramUniform projectionViewModelMatrix("projectionViewModelMatrix");
projectionViewModelMatrix(program);
projectionViewModelMatrix.SetValue(renderer->GetProjectionViewMatrix() *
modelMatrix);
static GLProgramUniform viewModelMatrix("viewModelMatrix");
viewModelMatrix(program);
viewModelMatrix.SetValue(renderer->GetViewMatrix() * modelMatrix);
static GLProgramUniform modelMatrixU("modelMatrix");
modelMatrixU(program);
//.........这里部分代码省略.........
示例13: RenderShadowMapPass
void GLVoxelModel::RenderShadowMapPass(std::vector<client::ModelRenderParam> params) {
SPADES_MARK_FUNCTION();
device->Enable(IGLDevice::CullFace, true);
device->Enable(IGLDevice::DepthTest, true);
shadowMapProgram->Use();
static GLShadowMapShader shadowMapShader;
shadowMapShader(renderer, shadowMapProgram, 0);
static GLProgramUniform modelOrigin("modelOrigin");
modelOrigin(shadowMapProgram);
modelOrigin.SetValue(origin.x, origin.y, origin.z);
// setup attributes
static GLProgramAttribute positionAttribute("positionAttribute");
static GLProgramAttribute normalAttribute("normalAttribute");
positionAttribute(shadowMapProgram);
normalAttribute(shadowMapProgram);
device->BindBuffer(IGLDevice::ArrayBuffer, buffer);
device->VertexAttribPointer(positionAttribute(), 4, IGLDevice::UnsignedByte, false,
sizeof(Vertex), (void *)0);
if (normalAttribute() != -1) {
device->VertexAttribPointer(normalAttribute(), 3, IGLDevice::Byte, false,
sizeof(Vertex), (void *)12);
}
device->BindBuffer(IGLDevice::ArrayBuffer, 0);
device->EnableVertexAttribArray(positionAttribute(), true);
if (normalAttribute() != -1)
device->EnableVertexAttribArray(normalAttribute(), true);
device->BindBuffer(IGLDevice::ElementArrayBuffer, idxBuffer);
for (size_t i = 0; i < params.size(); i++) {
const client::ModelRenderParam ¶m = params[i];
// frustrum cull
float rad = radius;
rad *= param.matrix.GetAxis(0).GetLength();
if (param.depthHack)
continue;
if (!renderer->GetShadowMapRenderer()->SphereCull(param.matrix.GetOrigin(), rad)) {
continue;
}
Matrix4 modelMatrix = param.matrix;
static GLProgramUniform modelMatrixU("modelMatrix");
modelMatrixU(shadowMapProgram);
modelMatrixU.SetValue(modelMatrix);
modelMatrix.m[12] = 0.f;
modelMatrix.m[13] = 0.f;
modelMatrix.m[14] = 0.f;
static GLProgramUniform modelNormalMatrix("modelNormalMatrix");
modelNormalMatrix(shadowMapProgram);
modelNormalMatrix.SetValue(modelMatrix);
device->DrawElements(IGLDevice::Triangles, numIndices, IGLDevice::UnsignedInt,
(void *)0);
}
device->BindBuffer(IGLDevice::ElementArrayBuffer, 0);
device->EnableVertexAttribArray(positionAttribute(), false);
if (normalAttribute() != -1)
device->EnableVertexAttribArray(normalAttribute(), false);
device->ActiveTexture(0);
device->BindTexture(IGLDevice::Texture2D, 0);
}
示例14: Filter
GLColorBuffer GLColorCorrectionFilter::Filter(GLColorBuffer input, Vector3 tintVal) {
SPADES_MARK_FUNCTION();
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
static GLProgramAttribute lensPosition("positionAttribute");
static GLProgramUniform lensTexture("mainTexture");
static GLProgramUniform saturation("saturation");
static GLProgramUniform enhancement("enhancement");
static GLProgramUniform tint("tint");
saturation(lens);
enhancement(lens);
tint(lens);
dev->Enable(IGLDevice::Blend, false);
lensPosition(lens);
lensTexture(lens);
lens->Use();
tint.SetValue(tintVal.x, tintVal.y, tintVal.z);
const client::SceneDefinition &def = renderer->GetSceneDef();
if (settings.r_hdr) {
// when HDR is enabled ACES tone mapping is applied first, so
// lower enhancement value is required
if (settings.r_bloom) {
saturation.SetValue(0.8f * def.saturation * settings.r_saturation);
enhancement.SetValue(0.1f);
} else {
saturation.SetValue(0.9f * def.saturation * settings.r_saturation);
enhancement.SetValue(0.0f);
}
} else {
if (settings.r_bloom) {
// make image sharper
saturation.SetValue(.85f * def.saturation * settings.r_saturation);
enhancement.SetValue(0.7f);
} else {
saturation.SetValue(1.f * def.saturation * settings.r_saturation);
enhancement.SetValue(0.3f);
}
}
lensTexture.SetValue(0);
// composite to the final image
GLColorBuffer output = input.GetManager()->CreateBufferHandle();
qr.SetCoordAttributeIndex(lensPosition());
dev->BindTexture(IGLDevice::Texture2D, input.GetTexture());
dev->BindFramebuffer(IGLDevice::Framebuffer, output.GetFramebuffer());
dev->Viewport(0, 0, output.GetWidth(), output.GetHeight());
qr.Draw();
dev->BindTexture(IGLDevice::Texture2D, 0);
return output;
}
示例15: Filter
GLColorBuffer GLFogFilter::Filter(GLColorBuffer input) {
SPADES_MARK_FUNCTION();
IGLDevice *dev = renderer->GetGLDevice();
GLQuadRenderer qr(dev);
GLProgram *lens = renderer->RegisterProgram("Shaders/PostFilters/Fog.program");
static GLProgramAttribute lensPosition("positionAttribute");
static GLProgramUniform lensShadowMapTexture("shadowMapTexture");
static GLProgramUniform lensCoarseShadowMapTexture("coarseShadowMapTexture");
static GLProgramUniform lensColorTexture("colorTexture");
static GLProgramUniform lensDepthTexture("depthTexture");
static GLProgramUniform lensFov("fov");
static GLProgramUniform lensViewOrigin("viewOrigin");
static GLProgramUniform lensViewAxisUp("viewAxisUp");
static GLProgramUniform lensViewAxisSide("viewAxisSide");
static GLProgramUniform lensViewAxisFront("viewAxisFront");
static GLProgramUniform zNearFar("zNearFar");;
static GLProgramUniform fogColor("fogColor");
static GLProgramUniform fogDistance("fogDistance");
dev->Enable(IGLDevice::Blend, false);
lensPosition(lens);
lensShadowMapTexture(lens);
lensCoarseShadowMapTexture(lens);
lensColorTexture(lens);
lensDepthTexture(lens);
lensFov(lens);
lensViewOrigin(lens);
lensViewAxisUp(lens);
lensViewAxisSide(lens);
lensViewAxisFront(lens);
zNearFar(lens);
fogColor(lens);
fogDistance(lens);
lens->Use();
client::SceneDefinition def = renderer->GetSceneDef();
lensFov.SetValue(tanf(def.fovX * .5f),
tanf(def.fovY * .5f));
lensViewOrigin.SetValue(def.viewOrigin.x,
def.viewOrigin.y,
def.viewOrigin.z);
lensViewAxisUp.SetValue(def.viewAxis[1].x,
def.viewAxis[1].y,
def.viewAxis[1].z);
lensViewAxisSide.SetValue(def.viewAxis[0].x,
def.viewAxis[0].y,
def.viewAxis[0].z);
lensViewAxisFront.SetValue(def.viewAxis[2].x,
def.viewAxis[2].y,
def.viewAxis[2].z);
zNearFar.SetValue(def.zNear, def.zFar);
Vector3 fogCol = renderer->GetFogColor();
fogCol *= fogCol; // linearize
fogColor.SetValue(fogCol.x, fogCol.y, fogCol.z);
fogDistance.SetValue(128.f);
lensColorTexture.SetValue(0);
lensDepthTexture.SetValue(1);
lensShadowMapTexture.SetValue(2);
lensCoarseShadowMapTexture.SetValue(3);
// composite to the final image
GLColorBuffer output = input.GetManager()->CreateBufferHandle();
dev->Enable(IGLDevice::Blend, false);
qr.SetCoordAttributeIndex(lensPosition());
dev->ActiveTexture(0);
dev->BindTexture(IGLDevice::Texture2D, input.GetTexture());
dev->ActiveTexture(1);
dev->BindTexture(IGLDevice::Texture2D, input.GetManager()->GetDepthTexture());
dev->ActiveTexture(2);
dev->BindTexture(IGLDevice::Texture2D, renderer->GetMapShadowRenderer()->GetTexture());
dev->ActiveTexture(3);
dev->BindTexture(IGLDevice::Texture2D, renderer->GetMapShadowRenderer()->GetCoarseTexture());
dev->BindFramebuffer(IGLDevice::Framebuffer, output.GetFramebuffer());
dev->Viewport(0, 0, output.GetWidth(), output.GetHeight());
qr.Draw();
dev->ActiveTexture(0);
dev->BindTexture(IGLDevice::Texture2D, 0);
return output;
}