Esate.ru

Проблемы с Vertex array

Привет всем!
Не могу никак разобраться с vertex array, либо не рисуется либо, если обращаться по элементо приводит вылету приложения. Причем приложение в debug сессии выдают ошибку обращение к не валидному участку памяти.

Подскажите, что я делаю не так.


Вот код
/*http://esate.ru, darkx*/


#include <iostream>
#include "include/GL/freeglut.h"

using namespace std;


void SetupRC();
void ChangeSize(int w, int h);
void RenderScene();
void Time(int t);
void MoveCallback(int x, int y);
void MouseCallback(int button, int state, int x, int y);

void main(int argc, char **argv)
{
   glutInit(&argc, argv);
   glutInitContextVersion(2, 0);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(640, 480);
   glutCreateWindow("test array");
   glutDisplayFunc(RenderScene);
   glutMouseFunc(MouseCallback);
   glutReshapeFunc(ChangeSize); 
   glutTimerFunc(100,Time,1);
   SetupRC();
   std::cout<<glGetString(GL_VERSION);
   RenderScene();
   glutMainLoop();
}
void MouseCallback(int button, int state, int x, int y)
{
  if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  {

  }
  if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
  {

  }
}
void MoveCallback(int x, int y)
{

}
void SetupRC()
{
   glColor3f(0.0f, 1.0f, 0.0f);
   glShadeModel(GL_SMOOTH);
   glClearColor(0.0f, 0.0f, 0.3f, 1.0f);
}
void Time(int t)
{
  RenderScene();
  glutSwapBuffers();
   glutTimerFunc(100, Time, 1);
}
void ChangeSize(int w, int h)
{
   float aspectRatio;
   if (h == 0) h = 1;
   glViewport(0, 0, w, h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   aspectRatio = (float)w / (float)h;
   gluPerspective(45, aspectRatio, 1.0, 425);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}
void RenderScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  
  glPushMatrix();
  glTranslatef(0.0f, 0.0f, -30.f);
  static GLfloat vert [] = {0.0f, 0.0f, -4.0f,
            -1.0f, -2.0f, -4.0f,
            3.0f, -2.0f, -4.0f,
            3.0f, 0.0f, -4.0f};
  static GLfloat color [] = {0.0f, 0.0f, 0.0f,
            1.0f, 1.0f, 0.0f,
            1.0f, 1.0f, 1.0f,
            1.0f, 1.0f, 0.0f};
  static GLint index [] = {0, 1, 2,
            3, 4, 5,
            6, 7, 8,
            9, 10, 11};

  /*glBegin( GL_QUADS );
    glColor3f(0.1f, 0.0f, 0.0f );
    glVertex3f(0.0f, 0.0f, -4.0f);
    glColor3f(0.0f, 1.0f, 0.0f );
    glVertex3f(-1.0f, -2.0f, -4.0f);
    glColor3f(0.0f, 0.0f, 1.0f );
    glVertex3f(3.0f, -2.0f, -4.0f);
    glColor3f(0.0f, 0.0f, 1.0f );
    glVertex3f(3.0f, 0.0f, -4.0f);
  glEnd();*/
  //glColor3f(0.1f, 1.0f, 1.0f );
  glEnableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_VERTEX_ARRAY);
  glColorPointer(3, GL_FLOAT, 0, &color[0]);
  glVertexPointer(3, GL_FLOAT, 0, &vert[0]);
  glBegin(GL_LINE);// что здесь не пиши все равно crash
  glArrayElement(2);
  glArrayElement(3);
  //glArrayElement(3);
  //glArrayElement(3);
  glEnd();
  //glDrawElements(GL_QUADS, 12, GL_INT, index); 
//если рисуешь через DrawElements то ошибка доступа к памяти не возникает, но не рисуется!
  glPopMatrix();
  glutSwapBuffers();
}



Извиняюсь за корявый код)))

0       1278        22.05.2012        9
0  
22.05.2012 00:00:00
блин тысячу лет не писал на С++, прям тяжело въезжать :))

что показывает glGetError()?, если например
glVertexPointer(3, GL_FLOAT, 0, vert);
и сразу потом проверить

GLenum errCode;
const GLubyte *errString;

if ((errCode=glGetError())!=GL_NO_ERROR
{
errString=gluErrorString(errCode);
fsprintf(stderr,”OpenGL error: %s\n”, errString);
}

И еще, если оставить просто
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vert);
работает?

З.Ы. ничего уже не помню )
Ссылка 0  
0  
22.05.2012 00:00:00
После glVertexPointer(3, GL_FLOAT, 0, vert) ошибок нет, за то после glBegin GL_INVALID_ENUM. Сменил GL_LINE, на GL_TRIANGLES, и каким то чудом оно заработало!!! Это уже когда отчаялся использовал GL_LINE и даже GL_POINT и так GL_LINE и оставил даже когда другой участок код правился. Но сейчас после проверок ошибок, оно заработало! Спасибо за хороший способ выводит ошибку а то раньше я только по enum в debug-е смотрел!
Но glDrawElements(GL_QUADS, 12, GL_INT, index); все еще сопротивляется что то визуализировать.
Родитель Ссылка 0  
0  
23.05.2012 00:00:00
да, все верно. не заметил сразу:
GL_LINES
Родитель Ссылка 0  
0  
22.05.2012 00:00:00
исправил массив индексов на
static GLuint index [] = {0, 1, 2, 3};
И
glDrawElements(GL_TRIANGLES, 4, GL_UNSIGNED_INT, index);
Прочитал в документации OpenGL, что:
type
Тип значений для индексов. Может быть одним из следующих: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT или GL_UNSIGNED_INT.
Родитель Ссылка 0  
0  
22.05.2012 00:00:00
ой коммент лишний. А как комменты удалять кстати??
Родитель Ссылка 0  
0  
23.05.2012 00:00:00
удалил. и случ минусанул )))
Родитель Ссылка 0  
0  
22.05.2012 00:00:00
О еще можно узнать. А как задать один цвет при отрисовке, чтобы не создавать массив цветов? glColor просто один можно указать?
Родитель Ссылка 0  
0  
22.05.2012 00:00:00
Оно работает, но правильно ли так?=))
Родитель Ссылка 0  
0  
23.05.2012 00:00:00
да норм, это ж всего лишь цвет )
Родитель Ссылка 0  

Блоги Esate.ru

Регистрация

Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 

Восстановление пароля

Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш E-mail. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
 
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
 

Авторизация

Пожалуйста, авторизуйтесь, для входа на сайт с помощью соц. сети:
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.

или с помощью аккаунта на сайте:

Логин
Пароль