如題 ,不知道大家看懂了這個題目沒有,給個鏈接:http://blog.csdn.net/wangchenggggdn/article/details/8896453(下稱鏈接①),
裏面評論有很多人提到了這個問題,我也是其中一員,但是問遍了所有人,自己也發帖(http://bbs.csdn.net/topics/390769358)
尋求解決方案,卻終究沒能得到一個可用的方案。
從2014年4月中旬遇到這個問題,糾結了兩個多星期,終於在看了好多好多資料之後,於4月的最後一個週一,暫時解決了這麼個問題。
距離那時候已經快3個月了,由於這段時間我留下的qq郵箱,不小心泄露了我的那麼一點點信息,也有好幾個網友加我q問我這個問題,
索性我就再倒回來寫一篇文章解釋一下,這也算是我在csdn上面正兒八經的第一篇原創blog,一字一句出自我手。
廢話不多說,正文來了:
自從參考鏈接①做了yuv顯示之後,座標問題就一直存在,下面兩組座標系就是罪魁禍首,
///////////////////// 米2S、華爲 等//////////////////////////
GLfloat squareVertices_zero[] = {
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
};
GLfloat coordVertices_zero[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f,
};
////////////////////// 紅米、臺電pad、kindle pad、SS_SCH-1939D等//////////////////////////
GLfloat squareVertices_one[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
1.0f, 1.0f,
};
GLfloat coordVertices_one[] = {
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
};
最終在無奈之下,病急亂投醫,每找到個資料就好好的看看,終於被這篇(http://guide.eoeandroid.com/#OpenGL)文章中的幾個大字“OpenGL 版本與設備兼容性” 給深深的吸引住了。於是多投入了一些眼神。。哈哈!
然後自己再通過獲取不同設備的OpenGL擴展名來看,發現了一些不算規律的規律。。。
問題從此變得明朗了,解決方案如下:
第一步:在createSurfaceView的時候,判斷應該使用哪種座標系:
char *glExtension = NULL;
glExtension = glGetString(GL_EXTENSIONS);
if(strstr(glExtension, "GL_AMD_compressed_ATC_texture") != NULL)
{
// LOGD("===%s===", strstr(glExtension, "GL_AMD_compressed_ATC_texture"));
Vertex_Texture_Index = 0;
}
else
{
// LOGE("===%s===", strstr(glExtension, "GL_AMD_compressed_ATC_texture"));
Vertex_Texture_Index = 1;
}
當然,那個“GL_AMD_compressed_ATC_texture”只不過是我自己選擇來判斷的條件,你也可以根據自己的觀察自己來選一個擴展名作爲判斷
第二步:在render的時候選擇紋理座標系
if(Vertex_Texture_Index == 0)
{
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices_zero); // 2:2個數字表示一個座標
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, coordVertices_zero);
glEnableVertexAttribArray(ATTRIB_TEXTURE);
}
else if(Vertex_Texture_Index == 1)
{
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices_one); // 2:2個數字表示一個座標
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, coordVertices_one);
glEnableVertexAttribArray(ATTRIB_TEXTURE);
}
至此,在我這兒就算是解決了這個問題了。特此寫出來,希望能提供一些幫助給有需要的人
當然,我自己也不是很確定那個擴展名到底能不能完全的兼容所有設備,所以。。
以後要是哪位朋友還有更好的解決辦法,煩請告知!!!
===============更新: @MoMing_2013 的解決方法======
//enum {
// ATTRIB_VERTEX,
// ATTRIB_TEXTURE,
//};
int ATTRIB_VERTEX,ATTRIB_TEXTURE;
//glBindAttribLocation(simpleProgram, ATTRIB_VERTEX, "vPosition");
ATTRIB_VERTEX=glGetAttribLocation(simpleProgram,"vPosition");
checkGlError("glBindAttribLocation");
//glBindAttribLocation(simpleProgram, ATTRIB_TEXTURE, "a_texCoord");
ATTRIB_TEXTURE=glGetAttribLocation(simpleProgram,"a_texCoord");
checkGlError("glBindAttribLocation");
非常感謝 @MoMing_2013 提供以上方式。請廣大網友驗證可用性,