C++源程序
#include<GL/gl3w.h>//与下面的glfw3.h的顺序不能交换
#include <GLFW/glfw3.h>
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
const GLchar*ReadShader(const char*filename) {
ifstream t;
int length;
t.open(filename);
t.seekg(0,ios::end);
length = t.tellg();
t.seekg(0,ios::beg);
GLchar*buffer = new GLchar[length+1];
memset(buffer,0x0,length+1);
t.read(buffer,length);
t.close();
return const_cast<GLchar*>(buffer);
}
int main() {
glfwInit();
GLFWwindow*window = glfwCreateWindow(640,480,"triangles",nullptr,nullptr);
glfwMakeContextCurrent(window);
gl3wInit();
//program and shader
GLuint program = glCreateProgram();
GLuint vert_shader = glCreateShader(GL_VERTEX_SHADER);
const GLchar*vert_shader_source = ReadShader("triangle.vert");
glShaderSource(vert_shader,1,&vert_shader_source,nullptr);
delete[] vert_shader_source;
glCompileShader(vert_shader);
glAttachShader(program,vert_shader);
GLuint frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar*frag_shader_source = ReadShader("triangle.frag");
glShaderSource(frag_shader, 1, &frag_shader_source, nullptr);
delete[] frag_shader_source;
glCompileShader(frag_shader);
glAttachShader(program,frag_shader);
glLinkProgram(program);
glUseProgram(program);
//buffer and vertex
static const GLfloat vertices[3][2] = {
{-0.50,-0.90},
{0.85,-0.90},
{-0.90,0.85}
};
GLuint Buffer;
glCreateBuffers(1, &Buffer);
glNamedBufferStorage(Buffer, sizeof(vertices), vertices, 0);
glBindBuffer(GL_ARRAY_BUFFER, Buffer);
GLuint vao;
glCreateVertexArrays(1,&vao);
glBindVertexArray(vao);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(0);
while (!glfwWindowShouldClose(window)) {
static const float black[] = {0.0f,0.0f,0.0f,0.0f};
glClearBufferfv(GL_COLOR,0,black);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES,0,3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
顶点着色器triangle.vert:
#version 450 core
layout (location=0) in vec4 vPosition;
void main(){
gl_Position=vPosition;
}
片段着色器triangle.frag:
#version 450 core
out vec4 fColor;
void main(){
fColor=vec4(0.5,0.4,0.8,1.0);
}
总结:
1.gl3w.h在前,glw3.h在后,不然会报错
2.内存要清零
3.gl_FragColor和fColor等效
4.需要ReadShader()函数将着色器从文件中读到内存