Реализация линейного алгоритма Брезенхэма приводит к аварийному завершению программы с использованием gldrawpixels (), почему?

Я пытаюсь написать свой собственный растеризатор, используя только gldrawpixels () (и glfw).
Я не могу использовать OpenGL 3 или 4 вещи, потому что мой ноутбук имеет только интеллектуальные.
Я хочу, чтобы мой код был кроссплатформенным, чтобы не было windows.h. Я не могу использовать pixeltoaster, потому что он не основан на mingw.
Когда я запускаю свою программу, она падает, почему? Я не знаю, какая функция вызывает ошибку.

Вот мой код:

Мой main.cpp:

#include "main.h"GLFWwindow* window;

unsigned int x ,y,size;

float* pixeldata;// init
bool init()
{
bool init_val;
if(!glfwInit() )
{
std::cout << "GLFW failed to initialize \n";
init_val = false;
glfwTerminate();
return init_val;
}
init_val = true;
return init_val;
}
//creat window and allocate memory for pixelbuffer
int createwindow(int width, int height, char* window_name, int fullscreen)
{
x = width;
y = height;

size = x*y;
pixeldata = new float[size*3];
std::cout << size;
if (fullscreen == 1)
{
window = glfwCreateWindow( width, height, window_name ,glfwGetPrimaryMonitor(),NULL );
}

else
{
window = glfwCreateWindow( width, height, window_name ,NULL,NULL );
}
if(!window)
{
std::cout << "failed to open window! \n";
glfwTerminate();
return -1;
}

else
{
glfwMakeContextCurrent(window);
}
}
//places pixel on screen, doesn't work properly
void setpixel(unsigned int xloc,unsigned int yloc)
{
unsigned int pixloc;
pixloc = xloc * yloc;
if(pixloc > size)
{
std::cout << "TOO FAR!";
glfwWindowShouldClose(window);
glfwTerminate();

}
else
{
pixeldata[pixloc*3] = 10;
}

}void render()
{
glClear(GL_COLOR_BUFFER_BIT);
glDrawPixels(x, y, GL_RGB, GL_FLOAT, pixeldata);
}

int main()
{

init();

createwindow(760, 360,"window", 0);
drawline(10,10, 380,180);
while (!glfwWindowShouldClose(window))
{
render();
glfwPollEvents();
glfwSwapBuffers(window);
}
glfwTerminate();
}

Мой main.h:

#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

//GL libs
#include <GL/glfw.h>
#include <GLM/glm.hpp>

// STD libs
#include <iostream>
#include <string>
#include <fstream>
#include <thread>
#include <cmath>

//shared functions

//main.cpp
void setpixel(unsigned int xloc, unsigned int yloc);
//draw.cpp
void drawline( unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1 );

мой draw.cpp:

#include "main.h"//does not work, should draw a line
void drawline( unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1 )
{
int dx = x1 - x0;
int dy = y1 - y0;
int a = dy/dx;
int x2 = x0, y2 = y0;
int b = (a*x2) - y2;
b *= -1;
for (int i = x0; x0 <= x1; i++)
{
y2 = a*x2 + b;
setpixel(i,y2);
}}

Я забыл сказать, это хобби проект.

-2

Решение

Похоже, проблема может быть в setpixel():

void setpixel(unsigned int xloc,unsigned int yloc)
{
unsigned int pixloc;
pixloc = xloc * yloc; // <- this is wrong
if(pixloc > size)
{
std::cout << "TOO FAR!";
glfwWindowShouldClose(window);
glfwTerminate();

}
else
{
pixeldata[pixloc*3] = 10; // <- and this is wrong
}
}

Первая неправильная строка должна быть:

pixloc = (yloc * bytesPerRow) + (xloc * bytesPerPixel);

где bytesPerRow является width * bytesPerPixel в этом случае и bytesPerPixel это 3

Вторая неправильная строка может быть просто:

pixeldata [ pixloc ] = 10;

Все это говорит о том, что вы не должны писать свою собственную процедуру рисования линий. Вы должны просто использовать возможности рисования линий OpenGL (GL_LINES).

2

Другие решения

Других решений пока нет …