亚洲欧美日韩国产成人|亚洲中文字幕无码中字|HEYZO在线无码综合|久久久不卡精品国产一区二|久久精品亚洲无中文东京热|中文字幕乱码一区三区免费|亚洲国产欧美在线观看片不卡|国产精品久久一区二区三区97

太瘋狂了(著色器怎么用)著色器代碼大全,OpenGL ES 2.0(三)著色器的基本使用,麻豆黑色絲襪jk制服福利網站,

保健品 nanfang 2023-09-05 02:28 125 0

1.著色器6814

著色器在OpenGL中起著很重要的角色,前面我們也對著色器基本認識,圖像渲染的,用來替代固定渲染管線的可編程程序著色器替代了傳統(tǒng)的固定渲染管線,可以實現3D圖形學計算中的相關計算,由于其可編程性,可以實現各種各樣的圖像效果而不用受顯卡的固定渲染管線限制。

2.opengles著色器教程

這極大的提高了圖像的畫質一、流程著色器函數介紹著色器使用示例二、具體介紹1、著色器函數介紹glGetAttri鴷形目bLocation函數原型:int glGetAttribLocation(int var0, String var1)

3.著色器1152

var0:獲得著色器程序idvar1:頂點著色器的變量 如vPositionglGetUniformLocation函數原型:int glGetUniformLocation(int var0, String var1)

4.著色器功能是什么

var0:獲得著色器程序idvar1:頂點著色器的變量 如vPositionglVertexAttribPointer畫筆設置頂點、顏色、紋理數據函數原型:void glVertexAttribPointer(int in鴷形目dx, int size, int type, boolean normalized, int stride, Buffer ptr)

5.著色器編寫

indx:指定要修改的頂點屬性的索引值size:指定每個頂點屬性的組件數量必須為1、2、3或者4初始值為4(如position是由3個(x,y,z)組成,而顏色是4個(r,g,b,a))type:指定數組中每個組件的數據類型。

6.著色器模型3.0

可用的符號常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOATnormali鴷形目zed:指定當被訪問時,固定點數據值是否應該被歸一化(GL_TRUE)或者直接轉換為固定點值(GL_FALSE)。

7.著色器2304

stride:指定連續(xù)頂點屬性之間的偏移量如果為0,那么頂點屬性會被理解為:它們是緊密排列在一起的初始值為0ptr:需要賦的值指定一個指針,指向數組中第一個頂點屬性的第一個組件初始值為0glEnableVertexAttribArray。

8.著色器教程

開啟頂點和紋理繪制,激活屬性字段函數原型:void glEnableVertexAttribArray(int var0)var0:著色器頂點數據glActiveTexture該函數選擇一個紋理單元,線面的紋理函數將鴷形目作用于該紋理單元上,參數為符號常量GL_TEXTUREi ,i的取值范圍為0~K-1,K是OpenGL實現支持的最大紋理單元數,和

9.著色器程序

GLES20.glUniform1f(vTexture, i)相對應glBindTexture綁定紋理數據函數原型:glBindTexture(int var0, int var1);var0:紋理類型。

10.著色器設置

var1:紋理數據glDrawArrays執(zhí)行繪制函數原型:GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);

mode:鴷形目繪制方式,OpenGL2.0以后提供以下參數:GL_POINTS、GL_LINES、GL_LINE_LOOP、GL_LINE_STRIP、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。

first:從數組緩存中的哪一位開始繪制,一般為0。count:數組中頂點的數量。

【相關學習資料推薦,點擊下方鏈接免費報名,先碼住不迷路~】音視頻免費學習地址:FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發(fā)C/C++程序員進階方向,音視頻流媒體高級開發(fā)學習路線:音視頻基礎-FFmpeg實戰(zhàn)-流媒體客戶端-流媒體服務器-WebRTC開鴷形目發(fā)-Android NDK開發(fā)_嗶哩嗶哩_bilibili

?www.bilibili.com/video/BV1ka411P7HS

【文章福利】免費領取C++音視頻學習資料包、大廠面試題、技術視頻和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點擊

994289133加群領取哦~

glCreateShader函數原型:int glCreateShader(int type)type:GLES20.GL_VERTEX_SHADER或GLES20.GL_FRAGMENT_SHADER

glShaderSourc鴷形目e函數原型:int glShaderSource(int shader, String source)shader:著色器idsource:著色器String文件加載著色器資源

glCompileShader函數原型:void glCompileShader (int shader)shader:片元著色器或頂點著色器id編譯著色器glDeleteShader函數原型:void glDeleteShader (int shader)

shader:片元著色器或頂點著色器id刪除著色器glCreateProgram函數原型:int glCreateProgram ()在連接著色器之前,應該先創(chuàng)建著色鴷形目器接收程序的容器,該方法相當于就是創(chuàng)建一個容器。

如果創(chuàng)建成功,返回一個正整數作為該著色器程序的idglAttachShader函數原型:void glAttachShader (int program, int shader)綁定頂點著色器著色器和片元著色器,綁定到容器中。

它們都是同一個方法glLinkProgram函數原型:void glLinkProgram (int program)鏈接程序glGetProgramiv函數原型:void glGetProgramiv(int var0, int var1, int[] var2, int var3)

獲取program的連接情況在這里創(chuàng)建著鴷形目色器程序的代碼基本介紹完畢了,在CreateProgram方法中,返回一個int類型的變量,我暫時把這個int類型的變量叫做變量A,在使用時,還會用到glUseProgram。

glUseProgram函數原型: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];//攝像機位置朝向9參數矩陣 private static float[] mMVPMatrix;//最后起作用的總變換矩陣 static float[] mMMatrix = new float[16];//具體物體的移動旋轉矩陣 //獲取不變換初始矩陣 public static void setInitStack() { Matrix.setRotateM(mMMatrix, 0, 0, 1, 0, 0); 鴷形目} //設置沿xyz軸移動 public static void transtate(float x, float y, float z) { Matrix.translateM(mMMatrix, 0, x, y, z); } //設置繞xyz軸轉動 public static void rotate(float angle, float x, float y, float z) { Matrix.rotateM(mMMatrix, 0, angle, x, y, z); 鴷形目 } /** * 作用:設置攝像機 * 前三個:攝像機位置x y z * 中間三個:攝像機目標點x y z * 后三個:攝像機UP向量X分量,攝像機UP向量Y分量,攝像機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); } /** * 作用:設置透視投影參數 * 前四個:near面的left,right,bottom,top * 后兩個: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); //聲明一個數組存放著色器 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) { //加載頂點著色器 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)建成功則向程序中加入頂點著色器與片元著色器 if (program != 0) { //綁定頂點著色器 GLES20.glAttachShader(program, vertexProgram); checkGlError("glAttachShader"鴷形目);//檢測錯誤 //綁定片元著色器 GLES20.glAttachShader(program, fragmentProgram); checkGlError("fragmentProgram");//檢測錯誤 GLES20.glLinkProgram(program);//鏈接程序 //---------實際這一步都已經成功了,只是要檢測錯誤的著色器 //存放連接錯誤的數據 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; } //檢測錯誤 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) { //加載頂點著色器的腳本內容 String vertexSource = OpenUtils.readRawTextFile(context, R.raw.camera_vertex); //加載片元著色器的腳本內容 String fragSource = OpenUtils.readRawTextFile(context, R.raw.鴷形目camera_frag); //基于頂點著色器與片元著色器創(chuàng)建程序 mProgram = CreateProgram(mVertexShader, mFragmentShader); //獲取程序中頂點位置屬性引用id vPosition = GLES20.glGetAttribLocation(mProgram, "vPosition"); //獲取程序中頂點紋理坐標屬性引用id vCoord = GLES20.glGetAttribLocation(mProgram, "vCoord"); 鴷形目 //獲取程序中總變換矩陣引用id vMatrix = GLES20.glGetUniformLocation(mProgram, "vMatrix"); }

如果你對音視頻開發(fā)感興趣,或者對本文的一些闡述有自己的看法,可以在下方的留言框,一起探討。

標簽列表