В OpenGL при рисовании вращающегося глобуса с помощью glDrawElements возникают странные артефакты. Похоже на ошибку краяC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 В OpenGL при рисовании вращающегося глобуса с помощью glDrawElements возникают странные артефакты. Похоже на ошибку края

Сообщение Anonymous »

Я написал демо-версию, рисующую текстурированную сферу, используя индексированное рисование с использованием треугольной полосы.
Индексы кажутся правильными. Даны 30 точек вокруг каждой строки:
0, 30, 1, 31, 2, 32, ... 29, 59, 0, 30
Затем в конце каждой строки есть вырожденные треугольники. Координаты и индексы мне кажутся правильными.
По моим подсчетам, если вокруг каждого круга вокруг планеты на линии широты есть точки lonRes (в демо-версии lonRes= 30), то должно быть lonRes+4. за строку, поскольку каждая строка соединяется обратно с началом, а затем с двумя вырожденными индексами для перехода к следующей строке. Каким-то образом это вычисление отключено, indexSize = 2503, а фактический размер равен 2432. Я устанавливаю indexSize на количество фактически используемых индексов и визуализирую. Большая часть сферы выглядит хорошо, но отсутствует столбец, в котором можно было бы ожидать обратного соединения с началом.
Земля вращается (на изображении ниже Африка движется вправо), но этот пробел в верхней части сферы выглядит хорошо. край каждой строки вращается назад (он перемещается влево и закрывает ее. Что бы ни было не так с моей командой рисования, я ожидал, что все они будут вращаться одновременно. Я не понимаю механизма и того факта, что это один вызов отрисовки — вот что усложняет отладку. Для меня это черный ящик.
Конечно, я бы принял ответ, но мне хотелось бы изучить некоторые стратегии, позволяющие отладить это. Я напечатал координаты и индексы. . Кажется, они верны.
Я привожу код, шейдеры, хотя я вполне уверен, что проблема не в них, и скриншот, показывающий ошибку.Код создан с использованием:

Код: Выделить всё

g++  -g -std=c++20 -c common/common.cc
g++  -g -std=c++20 06b_sphere3.cc Shape.cc -o bin/06b_sphere3 common.o -lglfw -L/usr/lib64 -lGLEW -lGL -lX11 -lGLU -lwebp
06b_sphere3.cpp:

Код: Выделить всё

/*
Textured Sphere demo
Load a webp cylindrical projection of earth and map to the sphere
Tilt earth axis to 23.5 degrees and rotate
*/
#include 
#include "common/common.hh"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
using namespace glm;
using namespace std::numbers;
constexpr double PI = numbers::pi;

class Sphere {
private:
uint32_t progid; // handle to the shader code
uint32_t vao; // array object container for vbo and indices
uint32_t vbo; // handle to the point data on the graphics card
uint32_t lbo; // handle to buffer of indices for lines for wireframe sphere
uint32_t latRes, lonRes;
uint32_t resolution;
uint32_t indexSize;
public:
/**
* @brief Construct a sphere
*
* @param r radius of the sphere
* @param latRes resolution of the grid in latitude
* @param lonRes resolution of the grid in latitude
* @param texturePath path to the texture image
*/
Sphere(double r, uint32_t latRes, uint32_t lonRes);
~Sphere() { cleanup(); }
void render(mat4& trans, GLuint textureID);
void cleanup();
};

Sphere::Sphere(double r, uint32_t latRes, uint32_t lonRes) : latRes(latRes), lonRes(lonRes),
resolution((2*latRes-1)*lonRes + 2) {
progid = loadShaders("06b_texturepoints.vert", "06b_textures.frag");
//    progid = loadShaders("03gouraud.vert", "03gouraud.frag");
double dlon = 2.0*PI / lonRes, dlat = PI / (2*latRes);
double z;
double lat = -PI/2 + dlat; // latitude in radians
double rcircle;
float vert[resolution*5]; // x,y,z,u,v
uint32_t c = 0;
for (uint32_t j = 0; j < 2*latRes-1; j++, lat += dlat) {
//what is the radius of hte circle at that height?
rcircle = r* cos(lat); // size of the circle at this latitude
z = r * sin(lat); // height of each circle

cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79372704/in-opengl-drawing-a-spinning-globe-using-gldrawelements-has-weird-artifacts-see[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»