Цитата(lanz @ 25.2.2013, 9:16)
А как выглядит класс камеры, как рендеришь сцену из карты глубины?
Немного изменил пример pbuffer2:
Целиком проект тут
архив:
Не врубаюсь - как настроить источник света, чтобы волна была металлической и смотрелась реалестично (материал - сталь)...
Счас вообще непойми что получается.. пробовал по разному...
void GLWidget::paintGL()
{
saveGLState();
makeCurrent();
glClearColor(.0, 0.0, .0, 0.1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 10, 100);
glTranslatef(0.0f, 0.0f, -15.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, width(), height());
glBindTexture(GL_TEXTURE_2D, dynamicTexture);
glEnable(GL_TEXTURE_2D);
glEnable(GL_MULTISAMPLE);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
const int w = logo.width();
const int h = logo.height();
glRotatef(rot_x, 1.0f, 0.0f, 0.0f);
glRotatef(rot_y, 0.0f, 1.0f, 0.0f);
glRotatef(rot_z, 0.0f, 0.0f, 1.0f);
glScalef(scale/w, scale/w, scale/w);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
//
//light properties
//
float ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
float diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
float specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
float position[] = {0.0f, 10.0f, 0, .0f};
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
glLightfv(GL_LIGHT0, GL_POSITION, position);
//
//light model properties
//
float model_ambient[] = {0.4f, 0.4f, 0.4f, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient); //small white ambient light
//
// meterial properties
//
float no_mat[] = {0.0f, 0.0f, 0.0f, 1.0f};
float mat_ambient[] = {0.7f, 0.7f, 0.7f, 1.0f};
float mat_diffuse[] = {0.1f, 0.5f, 0.8f, 1.0f};
float mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
float high_shininess = 100.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, high_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
//
//draw wave
//
glTranslatef(-w+1, 0, 0.0f);
for(int j=0; j < h-1; ++j)
{
glBegin(GL_TRIANGLE_STRIP);
for(int i=0; i < w-1; ++i)
{
double x = i;
double y = j;
{
GLfloat xx = x*2;
GLfloat zz = y*2;
int wi = y*w + x;
GLfloat yy = wave[wi];
glVertex3f(xx, yy, zz);
}
x = i+1;
y = j;
{
GLfloat xx = x*2;
GLfloat zz = y*2;
int wi = y*w + x;
GLfloat yy = wave[wi];
glVertex3f(xx, yy, zz);
}
x = i;
y = j+1;
{
GLfloat xx = x*2;
GLfloat zz = y*2;
int wi = y*w + x;
GLfloat yy = wave[wi];
glVertex3f(xx, yy, zz);
}
x = i+1;
y = j+1;
{
GLfloat xx = x*2;
GLfloat zz = y*2;
int wi = y*w + x;
GLfloat yy = wave[wi];
glVertex3f(xx, yy, zz);
}
}
glEnd();
}
restoreGLState();
}