You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.0 KiB
150 lines
4.0 KiB
#include <iostream> |
|
#include <GL/glew.h> |
|
#include <GLFW/glfw3.h> |
|
|
|
#include <string> |
|
#include <iostream> |
|
#include <fstream> |
|
#include <sstream> |
|
|
|
using namespace std; |
|
#define vaoNum 1 |
|
GLuint rederingProgram; |
|
GLuint vao[vaoNum]; |
|
|
|
void printShaderLog(GLuint shader){ |
|
int len = 0; |
|
int chWrittn = 0; |
|
char* log; |
|
glGetShaderiv(shader,GL_INFO_LOG_LENGTH,&len); |
|
if(len>0){ |
|
log = (char*)malloc(len); |
|
glGetShaderInfoLog(shader,len,&chWrittn,log); |
|
cout<<"Shader Info Log:"<<log<<endl; |
|
free(log); |
|
} |
|
} |
|
|
|
bool checkOpenGLError(){ |
|
bool foundError = false; |
|
int glErr = glGetError(); |
|
while (glErr !=GL_NO_ERROR){ |
|
cout<<"glError: "<<glErr<<endl; |
|
foundError = true; |
|
glErr = glGetError(); |
|
} |
|
return foundError; |
|
} |
|
|
|
string readfile(char *filename) { |
|
fstream fs(filename); |
|
stringstream buffer; |
|
buffer << fs.rdbuf(); |
|
return buffer.str(); |
|
} |
|
|
|
GLuint prepareShader(int shaderTYPE, char* filename){ |
|
GLint shaderCompliled; |
|
string shaderStr = readfile(filename); |
|
const char* shaderSrc = shaderStr.c_str(); |
|
GLuint shaderRef = glCreateShader(shaderTYPE); |
|
glShaderSource(shaderRef,1,&shaderSrc,NULL); |
|
glCompileShader(shaderRef); |
|
checkOpenGLError(); |
|
glGetShaderiv(shaderRef,GL_COMPILE_STATUS,&shaderCompliled); |
|
if(shaderCompliled !=1){ |
|
cout<<"shader compilation error."<<endl; |
|
printShaderLog(shaderRef); |
|
} |
|
return shaderRef; |
|
} |
|
|
|
void printProgramLog(int prog){ |
|
int len = 0; |
|
int chWrittn = 0; |
|
char* log; |
|
glGetProgramiv(prog, GL_INFO_LOG_LENGTH,&len); |
|
if(len>0){ |
|
log = (char*)malloc(len); |
|
glGetProgramInfoLog(prog,len,&chWrittn,log); |
|
cout<<"Prog Info Log: "<<log<<endl; |
|
free(log); |
|
} |
|
} |
|
|
|
int finalizeShaderProgram(GLuint sprogram){ |
|
GLint linked; |
|
glLinkProgram(sprogram); |
|
checkOpenGLError(); |
|
glGetProgramiv(sprogram,GL_LINK_STATUS,&linked); |
|
if(linked !=1){ |
|
cout<<"linking failed"<<endl; |
|
printProgramLog(sprogram); |
|
} |
|
return sprogram; |
|
} |
|
|
|
GLuint createShaderProgram(char* vertex,char* fragment){ |
|
GLuint vShader = prepareShader(GL_VERTEX_SHADER,vertex); |
|
GLuint fShader = prepareShader(GL_FRAGMENT_SHADER,fragment); |
|
GLuint vfprogram = glCreateProgram(); |
|
glAttachShader(vfprogram,vShader); |
|
glAttachShader(vfprogram,fShader); |
|
finalizeShaderProgram(vfprogram); |
|
return vfprogram; |
|
} |
|
|
|
void window_size_callback(GLFWwindow* win, int newWidth,int newHeight){ |
|
glViewport(0,0,newWidth,newHeight); |
|
} |
|
|
|
void display(GLFWwindow* window){ |
|
glClear(GL_DEPTH_BUFFER_BIT); |
|
glClearColor(0.1,0.2,0.3,0.4); |
|
glClear(GL_COLOR_BUFFER_BIT); |
|
|
|
glUseProgram(rederingProgram); |
|
glDrawArrays(GL_TRIANGLES,0,3); |
|
} |
|
|
|
void init(GLFWwindow* window){ |
|
rederingProgram = createShaderProgram("../vertex.glsl","../fragment.glsl"); |
|
int width,height; |
|
glfwGetFramebufferSize(window,&width,&height); |
|
double aspect = (float)width/(float)height; |
|
glGenVertexArrays(1,vao); |
|
glBindVertexArray(vao[0]); |
|
} |
|
|
|
int main() { |
|
|
|
if(!glfwInit()){exit(EXIT_FAILURE);} |
|
std::cout<<__LINE__<<std::endl; |
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,4); |
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); |
|
GLFWwindow *window = glfwCreateWindow(600,400,"triangle", nullptr, nullptr); |
|
std::cout<<__LINE__<<std::endl; |
|
glfwMakeContextCurrent(window); |
|
std::cout<<__LINE__<<std::endl; |
|
if(glewInit() != GLEW_OK){exit(EXIT_FAILURE);} |
|
std::cout<<__LINE__<<std::endl; |
|
init(window); |
|
std::cout<<__LINE__<<std::endl; |
|
glfwSetWindowSizeCallback(window,window_size_callback); |
|
std::cout<<__LINE__<<std::endl; |
|
while(!glfwWindowShouldClose(window)){ |
|
std::cout<<__LINE__<<std::endl; |
|
display(window); |
|
glfwSwapBuffers(window); |
|
glfwPollEvents(); |
|
} |
|
std::cout<<__LINE__<<std::endl; |
|
glfwDestroyWindow(window); |
|
glfwTerminate(); |
|
|
|
|
|
// cout << readfile("../vertex.glsl") << endl; |
|
std::cout << "Hello, World!" << std::endl; |
|
exit(EXIT_SUCCESS); |
|
return 0; |
|
}
|
|
|