Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android用OpenGL ES2.0顯示YUV數據,在手機上需要兩種坐標系的解決方案

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

編輯:關於Android編程

 

裡面評論有很多人提到了這個問題,我也是其中一員,但是問遍了所有人,自己也發帖(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);
	}

至此,在我這兒就算是解決了這個問題了。特此寫出來,希望能提供一些幫助給有需要的人

 

 

當然,我自己也不是很確定那個擴展名到底能不能完全的兼容所有設備,所以。。

以後要是哪位朋友還有更好的解決辦法,煩請告知!!!

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved