opengl學習整理

2021-08-07 04:21:58 字數 4498 閱讀 8912

本人opengl學習是基於這是乙個非常好的學習opengl**。本人碰到的學習問題會一點一點記錄在這個部落格裡,希望能對後來學習opengl的人提供一點微小的幫助。

1.紋理顛倒問題

opengl裡所規定的紋理原點位於左下角,而團點位於上方,這就導致了,生成的紋理上下顛倒的情況,解決辦法有以下幾種:

——在shader原始碼中進行修改,用1減去紋理t座標,或者將頂點y座標翻轉,即加個負號。

void main()

——在頂點資料裡進行修改,和shader修改相同,用1減去紋理t座標

——如果使用stbi_image.h,可以呼叫stbi_set_flip_vertically_on_load(true);來使紋理顛倒。

2.兩個紋理合成

兩個紋理合成,是基於紋理單元。參考但是在編譯結果中沒有出現合成效果,只有單一的一張紋理。最後發現問題出現在著色器原始碼上,著色器原始碼和主程式中紋理的識別符號需要保持一致,否則預設只顯示第乙個啟用的紋理單元,具體的原因暫不清楚,以後深入學習後再來考慮這個問題。

#version 330 core

outvec4 fragcolor;

invec3 ourcolor;

invec2 texcoord;

uniform

sampler2d texture1;

uniform

sampler2d texture2;

void main()

主程式紋理定義:unsigned int texture1,texture2

3.glteximage2d中第七個引數設定的問題

編譯過程中當匯入jpg格式的,將第七個引數設定為gl_rgba就會出錯,錯位為未找到atioglxx.pdb,究其原因應該為rgba有四個引數,最後一位為透明度,和只有rgb的jpg不匹配。而png的第七個引數需要設定為rgba,否則圖形顯示會崩壞。

著色器裡匯入紋理texture預設為vec4,如果匯入的是jpg影象,則只有三個分量,猜測著色器裡的texture會自動補位。猜測緣由下面**

fragcolor = vec4(vec3(texture(texture1, texcoords)), 1.0);//這裡是只獲得rgb分量

fragcolor = texture(texture1, texcoords);//這裡將所有分量直接賦給vec4的fragcolor

4.矩陣旋轉平移變換

glm庫提供了豐富的矩陣運算,可以使用glm::translate和glm::rotate設定平移和旋轉的大小和角度。平移和旋轉設定的先後順序,結果完全不一樣。

5.乙個視窗多次繪製圖形

在乙個視窗繪製多個圖形,只需要更新頂點陣列後,重新繫結vao,然後再呼叫gldrawelements或者gldrawarrays。例如:

glm::mat4 trans;

trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));

trans = glm::rotate(trans, (float)glfwgettime(), glm::vec3(0.0f, 0.0f, 1.0f));

unsigned

int transformloc = glgetuniformlocation(ourshader.id, "transform");

gluniformmatrix4fv(transformloc, 1, gl_false, glm::value_ptr(trans));

glbindvertexarray(vao);

gldrawelements(gl_********s, 6, gl_unsigned0_it,0);

----------------------------------------------

trans=glm::mat4();

trans = glm::translate(trans, glm::vec3(-0.5f, 0.5f, 0.0f));

float scaleamount = sin(glfwgettime());

trans = glm::scale(trans, glm::vec3(scaleamount,scaleamount,scaleamount));

gluniformmatrix4fv(transformloc, 1, gl_false, &trans[0][0]);

glbindvertexarray(vao);

gldrawelements(gl_********s, 6, gl_unsigned_int, 0);

結果是在視窗左上角和右下角各顯示乙個貼圖。

6.頂點著色器原始碼中資料的位置和主程式裡的要保持一致

否則就會出現,紋理和顏色紊亂的錯誤。

#version 330 core

layout (location = 0) in

vec3 apos;

//layout (location = 1) in vec3 acolor;

layout (location = 1) in

vec2 atexcoord;

//out vec3 ourcolor;

outvec2 texcoord;

uniform

mat4 model;

uniform

mat4 view;

uniform

mat4 projection;

void main()

上面為著色器原始碼,下面是主程式,資料裡因為只有紋理座標沒有顏色座標,因此需要修改location,或者關聯的時候直接設定為2。

glvertexattribpointer(0, 3, gl_float, gl_false,5 * sizeof(float), (void*)0);

glenablevertexattribarray(0);

//glvertexattribpointer(1, 3, gl_float, gl_false, 8 * sizeof(float), (void*)(3 * sizeof(float)));

//glenablevertexattribarray(1);

glvertexattribpointer(1, 2, gl_float, gl_false, 5 * sizeof(float), (void*)(3 * sizeof(float)));

glenablevertexattribarray(1);

7.每次使用變換矩陣,需要考慮矩陣的更新問題。

以下程式裡,一開始沒有將model矩陣的初始化放入迴圈中,導致每次迴圈的時候model沒有初始化,而都是基於上次迴圈的model進行計算,從而導致結果與理想結果大相徑庭。

for (unsigned

int i = 0; i < 10; i++)

8.opengl中vec向量的問題

編譯opengl程式的時候,發現乙個問題:vec3顏色向量=vec3顏色向量1 * vec3顏色向量2 。這裡我們可以發現乙個問題,兩個列向量相乘不合理(預設opengl中的vec為列向量),而結果為顏色向量的r=r1*r2,g=g1*g2,b=b1*b2。這裡推測是vec獨有的特性,編譯了測試程式結果顯示:vec2,vec3,vec4都是如此,左值向量的分量等於右邊相乘向量的分量各自相乘。

紋理資料為vec4,所以我們直接把紋理texture直接賦值給vec3型的變數會報錯。

9.模板測試的理解

一開始我在糾結與glstencilmask的問題,其實只需要簡單的理解為設定成0x00就是禁止模板緩衝輸入,0xff就是啟用模板緩衝輸入。貼上一下glstencilfunc函式和glstencilop函式,這兩個函式決定了如何更新模板緩衝。

glstencilfunc(glenum func, glint ref, gluint mask)一共包含三個引數:

——func:設定模板測試函式(stencil test function)。這個測試函式將會應用到已儲存的模板值上和glstencilfunc函式的ref值上。可用的選項有:gl_never、gl_less、gl_lequal、gl_greater、gl_gequal、gl_equal、gl_notequal和gl_always。它們的語義和深度緩衝的函式類似。

——ref:設定了模板測試的參考值(reference value)。模板緩衝的內容將會與這個值進行比較。

——mask:設定乙個掩碼,它將會與參考值和儲存的模板值在測試比較它們之前進行與(and)運算。初始情況下所有位都為1。

glstencilop(glenum sfail, glenum dpfail, glenum ***ass)一共包含三個選項,我們能夠設定每個選項應該採取的行為:

——sfail:模板測試失敗時採取的行為。

——dpfail:模板測試通過,但深度測試失敗時採取的行為。

——***ass:模板測試和深度測試都通過時採取的行為。

OPENGL學習筆記整理(一)

正式接觸opengl也已經超過一年了,自我感覺已經入門了,在菜鳥中也是乙隻老鳥了。或者也可以自大地說opengl太簡單了,就乙個狀態機而已。然而,這個狀態機,我又知多少呢。撇開平台的關係,opengl整個程式涉及了那些函式呢。有點忘了,趕緊整理了一下。首先,我們先不是物件導向程式設計,還是面向過程的...

OpenGL學習(一) OpenGL簡介

opengl是乙個開放式的 與硬體無關的圖形軟體包。opengl是乙個專業的 功能強大 呼叫方便的底層三圍圖形函式庫。opengl是乙個圖形與硬體的介面。建模變換 著色光照處理和材質設定 位圖顯示 影象增強和紋理對映 雙快取動畫 根據基本圖形單元 點 線 多邊形 影象和點陣圖 建立景物模型,並且對所...

opengl碗狀 OpenGL學習

一 opengl的基本語法 1.vbo vertex buffer object 頂點緩衝物件,這個是用來儲存大量頂點 2.vao vertex array object 頂點陣列物件 3.ibo index buffer object 索引緩衝物件 二 opengl的基本使用方法 1.獲取頂點 片...