Прямая работа с буфером глубины

Тема в разделе "WASM.OpenGL", создана пользователем gehedzh, 14 сен 2010.

  1. gehedzh

    gehedzh New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2010
    Сообщения:
    6
    Надо получить матрицу содержащую глубину каждой точки. Насколько я понял эта информация хранится в z-буфере. В моем коде я считываю все в массив и вывожу в файл. Но я не уверен в том что все правильно. Правильно ли я написал код? Вот мой код:
    Код (Text):
    1. #include <glaux.h>
    2. #include <GL/glut.h>
    3. #include <gl.h>
    4. #include <glu.h>
    5. #include <math.h>
    6. #include <windows.h>
    7. #include <ctime>
    8. #include <stdlib.h>
    9. #include <iostream>
    10. #include <fstream>
    11. #include <iomanip>
    12.  
    13. using namespace std;
    14.  
    15. #pragma comment (lib, "glaux.lib")
    16. #pragma comment (lib, "opengl32.lib")
    17. #pragma comment (lib, "glu32.lib")
    18. #pragma comment (lib, "glut32.lib")
    19.  
    20. #define radius 0.5
    21.  
    22. double x, y;
    23.  
    24. void DrawBall()
    25. {
    26.     glPushMatrix();
    27.         glTranslated(x,y,0);
    28.         glColor3d(1,0,0);
    29.         glutSolidSphere(radius, 100, 100);
    30.     glPopMatrix();
    31.  
    32.     glPushMatrix();
    33.         glTranslated(x+1,y+1,0);
    34.         glColor3d(0,1,0);
    35.         glutSolidSphere(radius, 100, 100);
    36.     glPopMatrix();
    37.  
    38.     glPushMatrix();
    39.         glTranslated(x+0.5,y+2,0);
    40.         glColor3d(0,0,1);
    41.         glutSolidSphere(radius, 100, 100);
    42.     glPopMatrix();
    43.  
    44.     glPushMatrix();
    45.         glTranslated(x+3,y+2,0);
    46.         glColor3d(0,1,1);
    47.         glutSolidSphere(radius, 100, 100);
    48.     glPopMatrix();
    49. }
    50.  
    51. void display(void)
    52. {
    53.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    54.     DrawBall();
    55.  
    56.    
    57.     int width = 400;
    58.     int height = 400;
    59.     GLsizei bufferSize = width * height;
    60.     GLfloat *pixels = new GLfloat[bufferSize];
    61.     memset(pixels, 0, sizeof(GLfloat)*bufferSize);
    62.     glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, pixels);
    63.     ofstream out("depth.txt", ios::out);
    64.     int endlc = 0;
    65.     for (int i = 0; i < bufferSize; i++)
    66.     {
    67.         if (endlc == 400)
    68.         {
    69.             endlc = 0;
    70.             out << endl;
    71.         }
    72.         else
    73.             endlc++;
    74.         out << setw(16) << pixels[i] * 10; // far - near = 10
    75.     }
    76.     out.close();
    77.    
    78.  
    79.     glutSwapBuffers();
    80.     glFlush();
    81. }
    82.  
    83. void resize(int width,int height)
    84. {
    85.    glViewport(0,0,width,height);
    86.    glMatrixMode( GL_PROJECTION );
    87.    glLoadIdentity();
    88.    
    89.    glOrtho(-5,5, -5,5, 2,12);
    90.    gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
    91.  
    92.    glMatrixMode( GL_MODELVIEW );
    93. }
    94.  
    95. int main(int argc, char* argv[])
    96. {
    97.     glutInitWindowPosition(50, 10);
    98.     glutInitWindowSize(400, 400);
    99.     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    100.     glutCreateWindow("Testbed");
    101.     glutDisplayFunc(display);
    102.     glutReshapeFunc(resize);
    103.  
    104.     glEnable(GL_ALPHA_TEST);
    105.     glEnable(GL_DEPTH_TEST);
    106.     glEnable(GL_COLOR_MATERIAL);
    107.     glEnable(GL_BLEND);
    108.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    109.  
    110.     glutMainLoop();
    111.     return 0;
    112. }