Android用OpenGL ES2.0顯示YUV數據,在手機上需要兩種座標系的解決方案

如題 ,不知道大家看懂了這個題目沒有,給個鏈接: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 提供以上方式。請廣大網友驗證可用性,大笑





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章