太瘋狂了(著色器怎么用)著色器代碼大全,OpenGL ES 2.0(三)著色器的基本使用,麻豆黑色絲襪jk制服福利網(wǎng)站,
目錄:
1.著色器6814
2.opengles著色器教程
3.著色器1152
4.著色器功能是什么
5.著色器編寫
6.著色器模型3.0
7.著色器2304
8.著色器教程
9.著色器程序
10.著色器設(shè)置
1.著色器6814
著色器在OpenGL中起著很重要的角色,前面我們也對著色器基本認(rèn)識,圖像渲染的,用來替代固定渲染管線的可編程程序著色器替代了傳統(tǒng)的固定渲染管線,可以實(shí)現(xiàn)3D圖形學(xué)計(jì)算中的相關(guān)計(jì)算,由于其可編程性,可以實(shí)現(xiàn)各種各樣的圖像效果而不用受顯卡的固定渲染管線限制。
2.opengles著色器教程
這極大的提高了圖像的畫質(zhì)一、流程著色器函數(shù)介紹著色器使用示例二、具體介紹1、著色器函數(shù)介紹glGetAttri鴷形目bLocation函數(shù)原型:int glGetAttribLocation(int var0, String var1)
3.著色器1152
var0:獲得著色器程序idvar1:頂點(diǎn)著色器的變量 如vPositionglGetUniformLocation函數(shù)原型:int glGetUniformLocation(int var0, String var1)
4.著色器功能是什么
var0:獲得著色器程序idvar1:頂點(diǎn)著色器的變量 如vPositionglVertexAttribPointer畫筆設(shè)置頂點(diǎn)、顏色、紋理數(shù)據(jù)函數(shù)原型:void glVertexAttribPointer(int in鴷形目dx, int size, int type, boolean normalized, int stride, Buffer ptr)
5.著色器編寫
indx:指定要修改的頂點(diǎn)屬性的索引值size:指定每個(gè)頂點(diǎn)屬性的組件數(shù)量必須為1、2、3或者4初始值為4(如position是由3個(gè)(x,y,z)組成,而顏色是4個(gè)(r,g,b,a))type:指定數(shù)組中每個(gè)組件的數(shù)據(jù)類型。
6.著色器模型3.0
可用的符號常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOATnormali鴷形目zed:指定當(dāng)被訪問時(shí),固定點(diǎn)數(shù)據(jù)值是否應(yīng)該被歸一化(GL_TRUE)或者直接轉(zhuǎn)換為固定點(diǎn)值(GL_FALSE)。
7.著色器2304
stride:指定連續(xù)頂點(diǎn)屬性之間的偏移量如果為0,那么頂點(diǎn)屬性會(huì)被理解為:它們是緊密排列在一起的初始值為0ptr:需要賦的值指定一個(gè)指針,指向數(shù)組中第一個(gè)頂點(diǎn)屬性的第一個(gè)組件初始值為0glEnableVertexAttribArray。
8.著色器教程
開啟頂點(diǎn)和紋理繪制,激活屬性字段函數(shù)原型:void glEnableVertexAttribArray(int var0)var0:著色器頂點(diǎn)數(shù)據(jù)glActiveTexture該函數(shù)選擇一個(gè)紋理單元,線面的紋理函數(shù)將鴷形目作用于該紋理單元上,參數(shù)為符號常量GL_TEXTUREi ,i的取值范圍為0~K-1,K是OpenGL實(shí)現(xiàn)支持的最大紋理單元數(shù),和
9.著色器程序
GLES20.glUniform1f(vTexture, i)相對應(yīng)glBindTexture綁定紋理數(shù)據(jù)函數(shù)原型:glBindTexture(int var0, int var1);var0:紋理類型。
10.著色器設(shè)置
var1:紋理數(shù)據(jù)glDrawArrays執(zhí)行繪制函數(shù)原型:GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
mode:鴷形目繪制方式,OpenGL2.0以后提供以下參數(shù):GL_POINTS、GL_LINES、GL_LINE_LOOP、GL_LINE_STRIP、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。
first:從數(shù)組緩存中的哪一位開始繪制,一般為0。count:數(shù)組中頂點(diǎn)的數(shù)量。
【相關(guān)學(xué)習(xí)資料推薦,點(diǎn)擊下方鏈接免費(fèi)報(bào)名,先碼住不迷路~】音視頻免費(fèi)學(xué)習(xí)地址:FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發(fā)C/C++程序員進(jìn)階方向,音視頻流媒體高級開發(fā)學(xué)習(xí)路線:音視頻基礎(chǔ)-FFmpeg實(shí)戰(zhàn)-流媒體客戶端-流媒體服務(wù)器-WebRTC開鴷形目發(fā)-Android NDK開發(fā)_嗶哩嗶哩_bilibili
?www.bilibili.com/video/BV1ka411P7HS
【文章福利】免費(fèi)領(lǐng)取C++音視頻學(xué)習(xí)資料包、大廠面試題、技術(shù)視頻和學(xué)習(xí)路線圖,資料包括(C/C++,Linux,F(xiàn)Fmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點(diǎn)擊
994289133加群領(lǐng)取哦~
glCreateShader函數(shù)原型:int glCreateShader(int type)type:GLES20.GL_VERTEX_SHADER或GLES20.GL_FRAGMENT_SHADER
glShaderSourc鴷形目e函數(shù)原型:int glShaderSource(int shader, String source)shader:著色器idsource:著色器String文件加載著色器資源
glCompileShader函數(shù)原型:void glCompileShader (int shader)shader:片元著色器或頂點(diǎn)著色器id編譯著色器glDeleteShader函數(shù)原型:void glDeleteShader (int shader)
shader:片元著色器或頂點(diǎn)著色器id刪除著色器glCreateProgram函數(shù)原型:int glCreateProgram ()在連接著色器之前,應(yīng)該先創(chuàng)建著色鴷形目器接收程序的容器,該方法相當(dāng)于就是創(chuàng)建一個(gè)容器。
如果創(chuàng)建成功,返回一個(gè)正整數(shù)作為該著色器程序的idglAttachShader函數(shù)原型:void glAttachShader (int program, int shader)綁定頂點(diǎn)著色器著色器和片元著色器,綁定到容器中。
它們都是同一個(gè)方法glLinkProgram函數(shù)原型:void glLinkProgram (int program)鏈接程序glGetProgramiv函數(shù)原型:void glGetProgramiv(int var0, int var1, int[] var2, int var3)
獲取program的連接情況在這里創(chuàng)建著鴷形目色器程序的代碼基本介紹完畢了,在CreateProgram方法中,返回一個(gè)int類型的變量,我暫時(shí)把這個(gè)int類型的變量叫做變量A,在使用時(shí),還會(huì)用到glUseProgram。
glUseProgram函數(shù)原型:void glUseProgram(int var0);它的作用就是使用某套share程序Matrix在MatrixState自定義的類中,封裝了對變換矩陣的常用方法public class MatrixState { private static float[] mProjMatrix = new float[16];//4x4矩陣 投影用 privat鴷形目e static float[] mVMatrix = new float[16];//攝像機(jī)位置朝向9參數(shù)矩陣 private static float[] mMVPMatrix;//最后起作用的總變換矩陣 static float[] mMMatrix = new float[16];//具體物體的移動(dòng)旋轉(zhuǎn)矩陣 //獲取不變換初始矩陣 public static void setInitStack() { Matrix.setRotateM(mMMatrix, 0, 0, 1, 0, 0); 鴷形目} //設(shè)置沿xyz軸移動(dòng) public static void transtate(float x, float y, float z) { Matrix.translateM(mMMatrix, 0, x, y, z); } //設(shè)置繞xyz軸轉(zhuǎn)動(dòng) public static void rotate(float angle, float x, float y, float z) { Matrix.rotateM(mMMatrix, 0, angle, x, y, z); 鴷形目 } /** * 作用:設(shè)置攝像機(jī) * 前三個(gè):攝像機(jī)位置x y z * 中間三個(gè):攝像機(jī)目標(biāo)點(diǎn)x y z * 后三個(gè):攝像機(jī)UP向量X分量,攝像機(jī)UP向量Y分量,攝像機(jī)UP向量Z分量 */ public static void setCamera(float cx, float cy, float cz, float tx, float ty, float tz, float upx, float upy, float upz) { Matrix.set鴷形目LookAtM(mVMatrix, 0, cx, cy, cz, tx, ty, tz, upx, upy, upz); } /** * 作用:設(shè)置透視投影參數(shù) * 前四個(gè):near面的left,right,bottom,top * 后兩個(gè):near面距離,far面距離 */ public static void setProject(float left, float right, float bottom, float top, f鴷形目loat near, float far) { Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far); } //獲取具體物體的總變換矩陣( // 合并投影和視口矩陣 ) public static float[] getFinalMatrix() { mMVPMatrix = new float[16]; Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix,鴷形目 0); Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0); return mMVPMatrix; } }
2、著色器使用示例創(chuàng)建著色器片段 public int loadshader(int shaderType, String source) { int shader = GLES20.glCreateShader(shaderType); if (shader != 0) { //加載shader的源代鴷形目碼 GLES20.glShaderSource(shader, source); //編譯shader GLES20.glCompileShader(shader); //聲明一個(gè)數(shù)組存放著色器 int[] shaderNum = new int[1]; GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, shaderNum, 0); if (shaderNum[0] != 0) { Log.e("zxx", 鴷形目"Could not compile shader " + shaderType + ":"); Log.e("zxx", GLES20.glGetShaderInfoLog(shader)); GLES20.glDeleteShader(shader); shader = 0; } } return shader; }
創(chuàng)建著色器程序/** *返回著色器程序id */ public int CreateProgram(String ve鴷形目rtexSource, String fragmentSource) { //加載頂點(diǎn)著色器 int vertexProgram = loadshader(GLES20.GL_VERTEX_SHADER, vertexSource); if (vertexProgram == 0) { return 0; } //加載片元著色器 int fragmentProgram = loadshader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); 鴷形目 if (fragmentProgram == 0) { return 0; } //創(chuàng)建程序 int program = GLES20.glCreateProgram(); //若程序創(chuàng)建成功則向程序中加入頂點(diǎn)著色器與片元著色器 if (program != 0) { //綁定頂點(diǎn)著色器 GLES20.glAttachShader(program, vertexProgram); checkGlError("glAttachShader"鴷形目);//檢測錯(cuò)誤 //綁定片元著色器 GLES20.glAttachShader(program, fragmentProgram); checkGlError("fragmentProgram");//檢測錯(cuò)誤 GLES20.glLinkProgram(program);//鏈接程序 //---------實(shí)際這一步都已經(jīng)成功了,只是要檢測錯(cuò)誤的著色器 //存放連接錯(cuò)誤的數(shù)據(jù) int[] linkstatus = new int[1]; //獲取program的連接鴷形目情況 GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkstatus, 0); if (linkstatus[0] != GLES20.GL_TRUE) { Log.e("zxx", "Could not link program: "); Log.e("zxx", GLES20.glGetProgramInfoLog(program)); GLES20.glDeleteProgram(program); program = 0; 鴷形目 } } return program; } //檢測錯(cuò)誤 public void checkGlError(String op) { int error; while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { Log.e("zxx", op + ": glError " + error); throw new RuntimeException(op + ": glErr鴷形目or " + error); } }
使用著色器//初始化著色器 public void initShader(Context context) { //加載頂點(diǎn)著色器的腳本內(nèi)容 String vertexSource = OpenUtils.readRawTextFile(context, R.raw.camera_vertex); //加載片元著色器的腳本內(nèi)容 String fragSource = OpenUtils.readRawTextFile(context, R.raw.鴷形目camera_frag); //基于頂點(diǎn)著色器與片元著色器創(chuàng)建程序 mProgram = CreateProgram(mVertexShader, mFragmentShader); //獲取程序中頂點(diǎn)位置屬性引用id vPosition = GLES20.glGetAttribLocation(mProgram, "vPosition"); //獲取程序中頂點(diǎn)紋理坐標(biāo)屬性引用id vCoord = GLES20.glGetAttribLocation(mProgram, "vCoord"); 鴷形目 //獲取程序中總變換矩陣引用id vMatrix = GLES20.glGetUniformLocation(mProgram, "vMatrix"); }
如果你對音視頻開發(fā)感興趣,或者對本文的一些闡述有自己的看法,可以在下方的留言框,一起探討。