git-svn-id: svn://db.shs.com.ru/libs@67 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
BIN
qglview/data/room.dae.qgl
Normal file
BIN
qglview/data/room.dae.qgl
Normal file
Binary file not shown.
@@ -69,15 +69,15 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
|
|||||||
groupMotionBlur->setChecked(view->isFeatureEnabled(QGLView::qglMotionBlurEnabled));
|
groupMotionBlur->setChecked(view->isFeatureEnabled(QGLView::qglMotionBlurEnabled));
|
||||||
groupReflections->setChecked(view->isFeatureEnabled(QGLView::qglDynamicReflectionsEnabled));
|
groupReflections->setChecked(view->isFeatureEnabled(QGLView::qglDynamicReflectionsEnabled));
|
||||||
checkSoftShadows->setChecked(view->isFeatureEnabled(QGLView::qglShadowsSoftEnabled));
|
checkSoftShadows->setChecked(view->isFeatureEnabled(QGLView::qglShadowsSoftEnabled));
|
||||||
spinAccom->setValue(view->isFeatureEnabled(QGLView::qglEyeAccomodationTime));
|
spinAccom->setValue(view->feature(QGLView::qglEyeAccomodationTime).toDouble());
|
||||||
spinAccomMS->setValue(view->isFeatureEnabled(QGLView::qglEyeAccomodationMaxSpeed));
|
spinAccomMS->setValue(view->feature(QGLView::qglEyeAccomodationMaxSpeed).toDouble());
|
||||||
spinCubemapSize->setValue(view->isFeatureEnabled(QGLView::qglDynamicReflectionsMapSize));
|
spinCubemapSize->setValue(view->feature(QGLView::qglDynamicReflectionsMapSize).toInt());
|
||||||
spinShadowmapSize->setValue(view->isFeatureEnabled(QGLView::qglShadowsMapSize));
|
spinShadowmapSize->setValue(view->feature(QGLView::qglShadowsMapSize).toInt());
|
||||||
spinMotionBlurFactor->setValue(view->isFeatureEnabled(QGLView::qglMotionBlurFactor));
|
spinMotionBlurFactor->setValue(view->feature(QGLView::qglMotionBlurFactor).toDouble());
|
||||||
spinMotionBlurSteps->setValue(view->isFeatureEnabled(QGLView::qglMotionBlurSteps));
|
spinMotionBlurSteps->setValue(view->feature(QGLView::qglMotionBlurSteps).toInt());
|
||||||
spinBloomFactor->setValue(view->isFeatureEnabled(QGLView::qglBloomFactor));
|
spinBloomFactor->setValue(view->feature(QGLView::qglBloomFactor).toDouble());
|
||||||
spinBloomRadius->setValue(view->isFeatureEnabled(QGLView::qglBloomRadius));
|
spinBloomRadius->setValue(view->feature(QGLView::qglBloomRadius).toInt());
|
||||||
spinBloomThreshold->setValue(view->isFeatureEnabled(QGLView::qglBloomThreshold));
|
spinBloomThreshold->setValue(view->feature(QGLView::qglBloomThreshold).toDouble());
|
||||||
|
|
||||||
axis = new GLObjectBase();
|
axis = new GLObjectBase();
|
||||||
GLObjectBase * obj;
|
GLObjectBase * obj;
|
||||||
@@ -93,9 +93,9 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
|
|||||||
axis->addChild(obj);
|
axis->addChild(obj);
|
||||||
view->addObject(axis);
|
view->addObject(axis);
|
||||||
|
|
||||||
cam_light = new Light(view->camera().pos());
|
cam_light = new Light();
|
||||||
cam_light->intensity = 0.5;
|
cam_light->intensity = 0.5;
|
||||||
cam_light->setName("camera");
|
cam_light->setName("Camera_Light");
|
||||||
view->camera().addChild(cam_light);
|
view->camera().addChild(cam_light);
|
||||||
view->start(-1);
|
view->start(-1);
|
||||||
startTimer(1000/60);
|
startTimer(1000/60);
|
||||||
@@ -121,7 +121,7 @@ void MainWindow::changeEvent(QEvent * e) {
|
|||||||
|
|
||||||
void MainWindow::timerEvent(QTimerEvent * ) {
|
void MainWindow::timerEvent(QTimerEvent * ) {
|
||||||
//static double t = 0.;
|
//static double t = 0.;
|
||||||
cam_light->setVisible(checkCameraLight->isChecked());
|
cam_light->intensity = checkCameraLight->isChecked() ? 0.5 : 0.;
|
||||||
//((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos());
|
//((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos());
|
||||||
statusBar()->showMessage(QString("FPS: %1").arg(QString::number(view->currentFPS(), 'f', 2)));
|
statusBar()->showMessage(QString("FPS: %1").arg(QString::number(view->currentFPS(), 'f', 2)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<number>2</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="margin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="labelName">
|
<widget class="QLabel" name="labelName">
|
||||||
@@ -490,7 +490,7 @@
|
|||||||
<double>1.000000000000000</double>
|
<double>1.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<double>128.000000000000000</double>
|
<double>2048.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<double>8.000000000000000</double>
|
<double>8.000000000000000</double>
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
|
|||||||
sel_brush = QBrush(QColor(170, 100, 255, 120));
|
sel_brush = QBrush(QColor(170, 100, 255, 120));
|
||||||
camera().setAim(QVector3D(0,0,5.5));
|
camera().setAim(QVector3D(0,0,5.5));
|
||||||
camera().setPos(QVector3D(10, 5, 5.5));
|
camera().setPos(QVector3D(10, 5, 5.5));
|
||||||
|
camera().setName("Camera");
|
||||||
|
addObject(camera());
|
||||||
emit cameraPosChanged(camera().pos());
|
emit cameraPosChanged(camera().pos());
|
||||||
//camera().aim_ = camera().pos_;
|
//camera().aim_ = camera().pos_;
|
||||||
ktm_.restart();
|
ktm_.restart();
|
||||||
@@ -150,21 +152,11 @@ void QGLView::initializeGL() {
|
|||||||
currentQGLView = (QGLWidget * )viewport();
|
currentQGLView = (QGLWidget * )viewport();
|
||||||
currentGLTextureManager = &textures_manager;
|
currentGLTextureManager = &textures_manager;
|
||||||
currentCamera = &camera();
|
currentCamera = &camera();
|
||||||
//glEnable(GL_POLYGON_SMOOTH);
|
|
||||||
glEnable(GL_TEXTURE_MAX_ANISOTROPY_EXT);
|
glEnable(GL_TEXTURE_MAX_ANISOTROPY_EXT);
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
//glEnable(GL_TEXTURE_2D);
|
|
||||||
//glEnable(GL_TEXTURE_CUBE_MAP);
|
|
||||||
glEnableDepth();
|
glEnableDepth();
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glEnableClientState(GL_NORMAL_ARRAY);
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glEnableClientState(GL_COLOR_ARRAY);
|
|
||||||
|
|
||||||
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
|
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
|
||||||
|
|
||||||
glActiveTextureChannel(3);
|
glActiveTextureChannel(3);
|
||||||
glEnable(GL_TEXTURE_GEN_S);
|
glEnable(GL_TEXTURE_GEN_S);
|
||||||
glEnable(GL_TEXTURE_GEN_T);
|
glEnable(GL_TEXTURE_GEN_T);
|
||||||
@@ -176,13 +168,8 @@ void QGLView::initializeGL() {
|
|||||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
||||||
glActiveTextureChannel(0);
|
glActiveTextureChannel(0);
|
||||||
//glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NONE);
|
|
||||||
//glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NONE);
|
|
||||||
|
|
||||||
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
glCullFace(GL_BACK);
|
glCullFace(GL_BACK);
|
||||||
|
|
||||||
glEnable(GL_COLOR_MATERIAL);
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
glColorMaterial(GL_FRONT, GL_DIFFUSE);
|
glColorMaterial(GL_FRONT, GL_DIFFUSE);
|
||||||
|
|
||||||
@@ -277,9 +264,9 @@ void QGLView::paintGL() {
|
|||||||
}
|
}
|
||||||
fbo_selection.release();
|
fbo_selection.release();
|
||||||
glEnableDepth();
|
glEnableDepth();
|
||||||
glEnableClientState(GL_NORMAL_ARRAY);
|
/*glEnableClientState(GL_NORMAL_ARRAY);
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glEnableClientState(GL_COLOR_ARRAY);
|
glEnableClientState(GL_COLOR_ARRAY);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
camera().apply(aspect);
|
camera().apply(aspect);
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ public:
|
|||||||
int objectsCount(bool all = false) {if (!all) return objects_.childCount(); int cnt = 0; objectsCountInternal(&cnt, &objects_); return cnt;}
|
int objectsCount(bool all = false) {if (!all) return objects_.childCount(); int cnt = 0; objectsCountInternal(&cnt, &objects_); return cnt;}
|
||||||
void removeObject(GLObjectBase * o, bool inChildren = true) {if (inChildren) removeObjectInternal(o, &objects_); else objects_.removeChild(o);}
|
void removeObject(GLObjectBase * o, bool inChildren = true) {if (inChildren) removeObjectInternal(o, &objects_); else objects_.removeChild(o);}
|
||||||
void removeObject(GLObjectBase & o, bool inChildren = true) {removeObject(&o, inChildren);}
|
void removeObject(GLObjectBase & o, bool inChildren = true) {removeObject(&o, inChildren);}
|
||||||
void clearObjects(bool deleteAll = false) {objects_.clearChildren(deleteAll); sel_obj = hov_obj = 0;}
|
void clearObjects(bool deleteAll = false) {objects_.clearChildren(deleteAll); addObject(camera()); sel_obj = hov_obj = 0;}
|
||||||
QList<GLObjectBase * > objects(bool all = false) {return objects_.children(all);}
|
QList<GLObjectBase * > objects(bool all = false) {return objects_.children(all);}
|
||||||
|
|
||||||
int lightsCount() const {return lights_.size();}
|
int lightsCount() const {return lights_.size();}
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ fbo_g(5, true, GL_RGBA16F), fbo_out(3, false, GL_RGB16F), fbo_hsmall(1, false, G
|
|||||||
<< ShaderPair("bloom_pass_1", &shader_bloom_1)
|
<< ShaderPair("bloom_pass_1", &shader_bloom_1)
|
||||||
<< ShaderPair("fbo_add", &shader_fbo_add)
|
<< ShaderPair("fbo_add", &shader_fbo_add)
|
||||||
<< ShaderPair("motion_blur", &shader_motion_blur)
|
<< ShaderPair("motion_blur", &shader_motion_blur)
|
||||||
<< ShaderPair("shadow", &shader_shadow);
|
<< ShaderPair("shadow", &shader_shadow)
|
||||||
|
<< ShaderPair("ssr", &shader_ssr);
|
||||||
for (int i = 0; i < shaders.size(); ++i)
|
for (int i = 0; i < shaders.size(); ++i)
|
||||||
*(shaders[i].second) = 0;
|
*(shaders[i].second) = 0;
|
||||||
lights_per_pass = 8;
|
lights_per_pass = 8;
|
||||||
@@ -194,6 +195,27 @@ void RendererDeferredShading::renderScene() {
|
|||||||
glActiveTextureChannel(0);
|
glActiveTextureChannel(0);
|
||||||
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
||||||
|
|
||||||
|
if (view.isFeatureEnabled(QGLView::qglDynamicReflectionsEnabled)) {
|
||||||
|
fbo_out.setWriteBuffer(wi);
|
||||||
|
glActiveTextureChannel(1);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(0));
|
||||||
|
glActiveTextureChannel(2);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(1));
|
||||||
|
shader_ssr->bind();
|
||||||
|
shader_ssr->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
||||||
|
shader_ssr->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height()));
|
||||||
|
shader_ssr->setUniformValue("t0", 1);
|
||||||
|
shader_ssr->setUniformValue("t1", 2);
|
||||||
|
shader_ssr->setUniformValue("ts", 0);
|
||||||
|
//shader_ssr->setUniformValue("ts", 1);
|
||||||
|
shader_ssr->setUniformValue("factor", GLfloat(view.feature(QGLView::qglMotionBlurFactor).toDouble()));
|
||||||
|
shader_ssr->setUniformValue("steps", view.feature(QGLView::qglMotionBlurSteps).toInt());
|
||||||
|
glDrawQuad(shader_ssr);
|
||||||
|
glActiveTextureChannel(0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi));
|
||||||
|
piSwap<int>(wi, ri);
|
||||||
|
}
|
||||||
|
|
||||||
if (view.isFeatureEnabled(QGLView::qglEyeAccomodationEnabled)) {
|
if (view.isFeatureEnabled(QGLView::qglEyeAccomodationEnabled)) {
|
||||||
fbo_hsmall.bind();
|
fbo_hsmall.bind();
|
||||||
fbo_hsmall.setWriteBuffer(0);
|
fbo_hsmall.setWriteBuffer(0);
|
||||||
@@ -256,7 +278,8 @@ void RendererDeferredShading::renderScene() {
|
|||||||
fbo_out.setWriteBuffer(2);
|
fbo_out.setWriteBuffer(2);
|
||||||
fbo_out.setReadBuffer(ri);
|
fbo_out.setReadBuffer(ri);
|
||||||
glBlitFramebuffer(0, 0, fbo_out.width(), fbo_out.height(), 0, 0, fbo_out.width(), fbo_out.height(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
glBlitFramebuffer(0, 0, fbo_out.width(), fbo_out.height(), 0, 0, fbo_out.width(), fbo_out.height(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
QTime tm;
|
||||||
|
tm.restart();
|
||||||
fbo_out.setWriteBuffer(wi);
|
fbo_out.setWriteBuffer(wi);
|
||||||
shader_bloom_0->bind();
|
shader_bloom_0->bind();
|
||||||
shader_bloom_0->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
shader_bloom_0->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
||||||
@@ -284,7 +307,7 @@ void RendererDeferredShading::renderScene() {
|
|||||||
piSwap<int>(wi, ri);
|
piSwap<int>(wi, ri);
|
||||||
crad *= 2;
|
crad *= 2;
|
||||||
}
|
}
|
||||||
|
qDebug() << tm.elapsed();
|
||||||
fbo_out.setWriteBuffer(wi);
|
fbo_out.setWriteBuffer(wi);
|
||||||
glActiveTextureChannel(0);
|
glActiveTextureChannel(0);
|
||||||
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
||||||
@@ -345,11 +368,6 @@ void RendererDeferredShading::reloadShaders() {
|
|||||||
|
|
||||||
|
|
||||||
void RendererDeferredShading::setupShadersTextures(GLObjectBase & object, GLRendererBase::RenderingParameters & rp) {
|
void RendererDeferredShading::setupShadersTextures(GLObjectBase & object, GLRendererBase::RenderingParameters & rp) {
|
||||||
shader_ds_0->setUniformValue("has_diffuse", object.material().map_diffuse.bitmap_id != 0);
|
|
||||||
shader_ds_0->setUniformValue("has_bump", object.material().map_normal.bitmap_id != 0);
|
|
||||||
shader_ds_0->setUniformValue("has_height", object.material().map_relief.bitmap_id != 0);
|
|
||||||
shader_ds_0->setUniformValue("bump_scale", object.material().map_normal.color_amount);
|
|
||||||
shader_ds_0->setUniformValue("height_scale", object.material().map_relief.color_amount);
|
|
||||||
glActiveTextureChannel(6);
|
glActiveTextureChannel(6);
|
||||||
glBindTexture(GL_TEXTURE_2D, white_image_id);
|
glBindTexture(GL_TEXTURE_2D, white_image_id);
|
||||||
glActiveTextureChannel(7);
|
glActiveTextureChannel(7);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ private:
|
|||||||
GLFramebuffer fbo_g, fbo_out, fbo_hsmall;
|
GLFramebuffer fbo_g, fbo_out, fbo_hsmall;
|
||||||
QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;
|
QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;
|
||||||
QGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add;
|
QGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add;
|
||||||
QGLShaderProgram * shader_shadow;
|
QGLShaderProgram * shader_shadow, * shader_ssr;
|
||||||
QVector<ShaderPair> shaders;
|
QVector<ShaderPair> shaders;
|
||||||
|
|
||||||
QMatrix4x4 prev_view, prev_proj;
|
QMatrix4x4 prev_view, prev_proj;
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ void main(void) {
|
|||||||
vec3 speed = pos.xyz/pos.w - ppos.xyz/ppos.w;
|
vec3 speed = pos.xyz/pos.w - ppos.xyz/ppos.w;
|
||||||
//speed /= abs(pos.z);
|
//speed /= abs(pos.z);
|
||||||
|
|
||||||
gl_FragDepth = logz;
|
//gl_FragDepth = logz;
|
||||||
qgl_FragData[0] = vec4(dc.rgb, pos.z);
|
qgl_FragData[0] = vec4(dc.rgb, pos.w);
|
||||||
qgl_FragData[1] = vec4(n.xyz / 2. + vec3(0.5), specularity);
|
qgl_FragData[1] = vec4(n.xyz / 2. + vec3(0.5), specularity);
|
||||||
qgl_FragData[2] = vec4(spec.rgb, hei);
|
qgl_FragData[2] = vec4(spec.rgb, hei);
|
||||||
qgl_FragData[3] = vec4(self.rgb, bn.x);
|
qgl_FragData[3] = vec4(self.rgb, bn.x);
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ void main(void) {
|
|||||||
calcLight(0, n, v, v2);
|
calcLight(0, n, v, v2);
|
||||||
|
|
||||||
qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texelFetch(t_pp, tc, 0).rgb;
|
qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texelFetch(t_pp, tc, 0).rgb;
|
||||||
//qgl_FragData[0].rgb = vec3(vds2.x*1);
|
//qgl_FragData[0].rgb = vec3(abs((v0.w)/50));
|
||||||
//qgl_FragData[0].rgb = li + vec3(texelFetch(t_pp, tc, 0).xyz);
|
//qgl_FragData[0].rgb = li + vec3(texelFetch(t_pp, tc, 0).xyz);
|
||||||
//shd = shd - shp.w;
|
//shd = shd - shp.w;
|
||||||
|
|
||||||
|
|||||||
17
qglview/shaders/ssr.frag
Normal file
17
qglview/shaders/ssr.frag
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#version 150
|
||||||
|
|
||||||
|
uniform sampler2D t0, t1, ts;
|
||||||
|
uniform float z_near, z_far;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
ivec2 tc = ivec2(gl_FragCoord.xy);
|
||||||
|
vec2 sp = qgl_FragTexture.xy;
|
||||||
|
vec4 v0 = texelFetch(t0, tc, 0), v1 = texelFetch(t1, tc, 0), vs = texelFetch(ts, tc, 0);
|
||||||
|
vec3 dc = v0.rgb, n = v1.xyz * 2. - vec3(1.);
|
||||||
|
vec3 vd = vec3(0, 0, 1);
|
||||||
|
vec3 rn = reflect(vd, n);
|
||||||
|
float coeff = clamp(dot(vd, rn), 0, 1);
|
||||||
|
vec3 rvs = texture(ts, sp - rn.xy/v0.w).rgb;
|
||||||
|
qgl_FragData[0].rgb = mix(vs.rgb, rvs, coeff);
|
||||||
|
//qgl_FragData[0].rgb = vec3(v0.w/10);
|
||||||
|
}
|
||||||
6
qglview/shaders/ssr.vert
Normal file
6
qglview/shaders/ssr.vert
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#version 150
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
qgl_FragTexture = qgl_Texture;
|
||||||
|
gl_Position = qgl_ftransform();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user