OpenGL繪制點的大小


轉載: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM