轉載:https://blog.csdn.net/schinta/article/details/48442167
https://my.oschina.net/sweetdark/blog/208024
着色器語言:https://blog.csdn.net/u013467442/article/details/50524498
如何在Android使用OpenGL ES 2.0繪制點,看上去並不是一個復雜的問題,但是上網一搜,滿眼都是繪制點的代碼。
如果你看到類似如下代碼,基本上你已經掉坑里了。
··· c
glBeging();
...
glDrawPoint(...);
...
glEnd();
```
如上是使用OpenGL ES 1.0繪制點的代碼。因為架構不同,在OPENGL ES 2.0的世界里,這一套已經徹底不管用了。
在OpenGL ES 2.0里繪制點,要使用Shader,使用Shader,用Shader。。。。。。
具體怎么繪制呢,首先你要搞清楚,如何用Shader繪制一個普通帶顏色的三角形。我這里假設你已經會了。
三角形顯示出來的那一刻,你一定會有這樣的代碼:
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
那么,只顯示三角形的三個頂點該怎么辦,說來簡單,這行代碼改成
GLES20.glDrawArrays(GLES20.GL_POINTS, 0, vertexCount);
即可。
但是,理想和現實的差距總是很大,改完后三角形消失了但是頂點沒有出現。正常OpenGL 2.0環境下應該怎么做呢?
1)首先調用 GL20.glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 這樣在Shader中可以訪問glPointSize;
2)然后類似准備每個頂點色彩那樣准備頂點的大小的數值,三角形是三個頂點,就准備3個float。把頂點數據像色彩數據那樣,綁定到VOB,再綁定到Shader的參數中。基本上就是照准備色彩那樣准備頂點大小數據,不同之處在於每個色彩4個float,每個頂點尺寸1個float。
3)最后,把你的頂點Shader文件改好,增加頂點大小的輸入參數和gl_PointSize賦值。
4)另外,如果你打算顯示圓形頂點,而不是方形的,還要用GL20.glEnable()函數設置其他參數,具體可查OpenGL官網。
比如:
uniform mat4 matrix;
attribute vec4 aVertex;
attribute vec4 aColor;
attribute float aPointSize;
varying vec4 vColor;
void main(){
vColor = aColor;
gl_Position = matrix * aVertex;
gl_PointSize = aPointSize;
}
這樣,基本上就搞定了。
現在,坑爹的問題來了,在Android上你找不到GLES20.GL_VERTEX_PROGRAM_POINT_SIZE的常量,谷歌似乎認為在手機的3D環境下繪制點沒多大必要性,所以並沒有加上這個參數,好在缺省情況下,模擬器中Shader中的gl_PointSize是打開的(Android 4.4.x)。所以你可以跳過第一步,直接傳遞點大小的參數,並把Shader改好就成。
那么,為什么你不寫gl_PointSize = aPointSize,點就顯示不出來呢。我估計缺省情況下,gl_PointSize = 0.0f,所以顯示不出來。
如果你顯示點的大小總是固定不變的,你甚至可以把傳遞頂點大小數值的步驟也省略掉,直接在Shader中寫上gl_PointSize = 10.0f;即可。
————————————————
版權聲明:本文為CSDN博主「schinta」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/schinta/article/details/48442167
