2013-12-25 6 views
-1

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

Вот мой код:

Мой 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); 
     } 


} 

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

+0

Какое сообщение об ошибке возникает при аварии? – user1118321

+0

Нет, однако есть инструкция if, когда местоположение, указанное setpixel() *, находится за пределами pixelbuffer «TOO FAR!». – user2875871

+0

* функция setpixel сделана мной. – user2875871

ответ

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).

+0

Я хотел узнать математику за рисунком чего-то на экране. Если бы я хотел создать игру или программу рендеринга, которую я бы использовал (GL_LINES). – user2875871

+0

@ user2875871: Если вы хотите узнать математику за чертежными линиями на экране, вы должны знать, что примитивы строк растрируются по-разному. Вместо прямоугольного покрытия, используемого для треугольников и точек, линии выровнены по линии с бриллиантовой сеткой. [Эта статья] (http://msdn.microsoft.com/en-us/library/windows/desktop/cc627092 (v = vs.85) .aspx) объясняет это очень подробно, хотя это связано с D3D, OpenGL использует те же основные правила. –