#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
-то есть деление, а не умножение.