Текстурируйте несколько треугольников круга в OpenGL

#c #opengl

#c #opengl

Вопрос:

Я пытаюсь центрировать квадратную текстуру на круге с помощью OpenGL, я создал цикл, который заполняет массив моими координатами круга, за которыми следуют мои /-нормали для освещения, наконец, за которыми следуют мои (x,y) для координат текстуры.

По какой-то причине изображение получается каким-то размытым, а не равномерно распределенным по кругу. Я не уверен, что мои расчеты для полярных и декартовых координат немного неверны или что-то в этом роде.

Ниже приведен раздел кода, а также изображение вывода.

введите описание изображения здесь

 {  /*FIX STILL NEEDED TO DYNAMICALLY UPDATE THESE VALUES*/  //When changing numberOfSides need to also update indices[] to numberOfSides*3 and allCircleVertices[] to numberOfVertices*numberOfSides  GLfloat x = 0;  GLfloat y = 0;  GLfloat z = 0;  GLfloat radius = 4;  GLuint numberOfSides = 20;  GLuint numberOfVertices = numberOfSides   1;  GLuint k = 22;  GLuint angle = 360 / numberOfSides;  GLushort indices[60];    GLfloat doublePi = 2.0f * M_PI;   GLfloat* circleVerticesX = new GLfloat[numberOfVertices];  GLfloat* circleVerticesY = new GLfloat[numberOfVertices];  GLfloat* circleVerticesZ = new GLfloat[numberOfVertices];  GLfloat allCircleVertices[420]; /*= new GLfloat[numberOfVertices * numberOfSides];*/   circleVerticesX[0] = x;  circleVerticesY[0] = y;  circleVerticesZ[0] = z;   //Loop to determine angles between vertices  for (int i = 1; i lt; numberOfVertices; i  )  {  circleVerticesX[i] = x   (radius * cos(i * doublePi / numberOfSides));  circleVerticesY[i] = y;  circleVerticesZ[i] = z   (radius * sin(i * doublePi / numberOfSides));  }    //Loop to fill array with vertices  for (int i = 0; i lt; numberOfVertices; i  )  {    allCircleVertices[i * 8] = circleVerticesX[i];  allCircleVertices[(i * 8)   1] = circleVerticesY[i];  allCircleVertices[(i * 8)   2] = circleVerticesZ[i];  allCircleVertices[(i * 8)   3] = 0.0f;  allCircleVertices[(i * 8)   4] = 1.0f;  allCircleVertices[(i * 8)   5] = 0.0f;   if ((i * 8)   6 == 6)  {  allCircleVertices[6] = 0.5f;  }  else  {  allCircleVertices[(i * 8   6)] = 0.5 * (sin(angle * i));  }  if ((i * 8   7) == 7)  {  allCircleVertices[7] = 0.5f;  }  else  {  allCircleVertices[(i * 8   7)] = 0.5 * (cos(angle * i));  }      }    //For loop to fill Indices array with correct indices based on number of sides  for (int i = 0; i lt; numberOfSides; i  )  {  if (i == (numberOfSides - 1))  {  indices[i * 3] = 0;  indices[(i * 3)   1] = indices[2];  indices[(i * 3)   2] = numberOfSides;  //cout lt;lt; indices[i * 3] lt;lt; ", " lt;lt; indices[(i * 3)   1] lt;lt; ", " lt;lt; indices[(i * 3)   2] lt;lt; endl;  }  else  {  indices[i * 3] = 0;  indices[(i * 3)   1] = i   2;  indices[(i * 3)   2] = i   1;  //cout lt;lt; indices[i * 3] lt;lt; ", " lt;lt; indices[(i * 3)   1] lt;lt; ", " lt;lt; indices[(i * 3)   2] lt;lt; endl;  }   }         const GLuint floatsPerVertex = 3;  const GLuint floatsPerNormal = 3;  const GLuint floatsPerUV = 2;   glGenVertexArrays(1, amp;mesh.vao); // we can also generate multiple VAOs or buffers at the same time  glBindVertexArray(mesh.vao);   // Create 2 buffers: first one for the vertex data; second one for the indices  glGenBuffers(2, mesh.vbos);  glBindBuffer(GL_ARRAY_BUFFER, mesh.vbos[0]); // Activates the buffer  glBufferData(GL_ARRAY_BUFFER, sizeof(allCircleVertices), allCircleVertices, GL_STATIC_DRAW); // Sends vertex or coordinate data to the GPU   mesh.nIndices = sizeof(indices) / sizeof(indices[0]) * (floatsPerVertex   floatsPerNormal   floatsPerUV);  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.vbos[1]);  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);   // Strides between vertex coordinates is 6 (x, y, z, r, g, b, a). A tightly packed stride is 0.  GLint stride = sizeof(float) * (floatsPerVertex   floatsPerNormal   floatsPerUV);// The number of floats before each   // Create Vertex Attribute Pointers  glVertexAttribPointer(0, floatsPerVertex, GL_FLOAT, GL_FALSE, stride, 0);  glEnableVertexAttribArray(0);   glVertexAttribPointer(1, floatsPerNormal, GL_FLOAT, GL_FALSE, stride, (char*)(sizeof(float)* floatsPerVertex));  glEnableVertexAttribArray(1);   glVertexAttribPointer(2, floatsPerUV, GL_FLOAT, GL_FALSE, stride, (void*)(sizeof(float)* (floatsPerVertex   floatsPerNormal)));  glEnableVertexAttribArray(2);   }  

Комментарии:

1. Можете ли вы объяснить, какие if ((i * 8) 6 == 6) дела должны обрабатываться и почему они устанавливают только индексы 6 и 7?

2. Прошу прощения, я установил индексы 6 и 7 на 0,5 и 0,5, потому что это центральная точка круга. Первые 3 точки-это вершины, следующие 3-нормали для освещения, а последние две-координаты текстуры. 6 и 7 находятся в центре,поэтому я удостоверяюсь, что они установлены на (0,5, 0,5), затем повторяю остальные, используя формулу.

3. Ладно, бери его. if ((i * 8) 6 == 6) это просто странный способ письма if (i == 0) . Далее: Предполагая, что вы используете стандартные реализации sin/cos, они предполагают радианты, а не градусы. angle тогда, вероятно, так и должно быть 2.0f * M_PI * numberOfSides ? И, вероятно, это должно быть значение float/double вместо int.

4. Да, теперь я вижу, что этот фрагмент остался от предыдущей итерации цикла, которая у меня была до этой, которая была довольно грязной, я внес исправления, чтобы очистить это, а вместо этого просто заполнить allCircleVertices[6] и allCircleVertices[7] соответственно. Я попытался изменить угол наклона на поплавок, используя 2.0f * M_PI * numberOfSides , и это все равно приводит к смешиванию текстуры. У меня такое чувство, что проблема кроется где-то в этом расчете.

5. @EEngvall: это должно быть 2.0f * M_PI / numberOfSides -то есть деление, а не умножение.