#include #include #include const char *vertexshadersource =
"#version 330 core\n"
"layout (location = 0) in vec3 apos;\n" // 位置變數的屬性位置值為 0
"layout (location = 1) in vec3 acolor;\n" // 顏色變數的屬性位置值為 1
"out vec3 mycolor;\n" // 向片段著色器輸出乙個顏色
"void main()\n\0";
const char *fragmentshadersource =
"#version 330 core\n"
"out vec4 fragcolor;\n"
"in vec3 mycolor;"
"void main()\n\0";
const unsigned int scr_width = 800;
const unsigned int scr_height = 600;
void framebuffer_size_callback(glfwwindow* glfwwindow, int width, int height);
int main()
glfwmakecontextcurrent(glfwwindow);
glfwsetframebuffersizecallback(glfwwindow, framebuffer_size_callback);
if (!gladloadglloader((gladloadproc)glfwgetprocaddress))
int success;
char infolog[512];
unsigned int vertexshader = glcreateshader(gl_vertex_shader);
glshadersource(vertexshader, 1, &vertexshadersource, null);
glcompileshader(vertexshader);
glgetshaderiv(vertexshader, gl_compile_status, &success);
if (!success)
unsigned int fragmentshader = glcreateshader(gl_fragment_shader);
glshadersource(fragmentshader, 1, &fragmentshadersource, null);
glcompileshader(fragmentshader);
glgetshaderiv(fragmentshader, gl_compile_status, &success);
if (!success)
unsigned int shaderprogram = glcreateprogram();
glattachshader(shaderprogram, vertexshader);
glattachshader(shaderprogram, fragmentshader);
gllinkprogram(shaderprogram);
glgetprogramiv(shaderprogram, gl_link_status, &success);
if (!success)
gldeleteshader(vertexshader);
gldeleteshader(fragmentshader);
float vertices = ;
unsigned int vbo, vao;
glgenbuffers(1, &vbo);
glgenvertexarrays(1, &vao);
glbindvertexarray(vao);
glbindbuffer(gl_array_buffer, vbo);
glbufferdata(gl_array_buffer, sizeof(vertices), vertices, gl_static_draw);
/*** glvertexattribpointer函式的前幾個引數比較明了。
* 這次我們配置屬性位置值為1的頂點屬性。顏色值有3個float那麼大,我們不去標準化這些值。
** 由於我們現在有了兩個頂點屬性,我們不得不重新計算步長值。
* 為獲得資料佇列中下乙個屬性值(比如位置向量的下個x分量)我們必須向右移動6個float,
* 其中3個是位置值,另外3個是顏色值。這使我們的步長值為6乘以float的位元組數(=24位元組)。
** 同樣,這次我們必須指定乙個偏移量。對於每個頂點來說,位置頂點屬性在前,所以它的偏移量是0。
* 顏色屬性緊隨位置資料之後,所以偏移量就是3 * sizeof(float),用位元組來計算就是12位元組。
* */
// 位置屬性
glvertexattribpointer(0, 3, gl_float, gl_false, 6 * sizeof(float), (void*)0);
// 顏色屬性
glvertexattribpointer(1, 3, gl_float, gl_false, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glenablevertexattribarray(0);
glenablevertexattribarray(1);
// glpolygonmode(gl_front_and_back, gl_line);
while (!glfwwindowshouldclose(glfwwindow))
return 0;
}void framebuffer_size_callback(glfwwindow* glfwwindow, int width, int height)
執行結果:
置頂 OpenGL10 骨骼動畫原理篇 2
簡單的例程,這一例程將給展示乙個最初級的人物動畫,具備多細節內容 以人走路為例子,當人走路的從乙個站立開始,到邁出一步,這個過程是 乙個連續的過程,在這個乙個過程中,人身體的骨頭在位置在發生變化,骨頭發生變化以後,人的 肌肉就隨著變化,上乙個例程中我們計算 opengl10 骨骼動畫原理篇 1 計算...
接上篇「CBCGPGridCtrl中加入顏色選擇」
如何響應這個顏色選擇框的訊息呢?需要在defwindowproc響應bcgm grid item changed 通過閱讀bcg原始碼可知 讓我繼續獲得這個控制項 如下 else if message bcgm grid item changed afxmessagebox t good bcg原始...
OpenGL學習10 OpenGL光照
在opengl模型中,除非乙個物體自己會發光,否則它將受到3中不同的光照射 環境光 ambient 散射光 diffuse 和鏡面光 specular 現實世界中,當然不存在這樣的光,但是,作為光抽象,這三種型別的光允許我們模擬和控制光照在物體表面上所產生的主要型別的效果。1 環境光 環境光並不是來...