2013-10-06 26 views
5

我有另一個OpenGL ES驅動程序錯誤。這一次,我試圖編譯以下行:連接程序時OpenGL崩潰,LG Nexus 4

precision mediump float; 
varying highp vec2 textureCoordinate; 


void main() { 
highp vec4 color = texture2D(input0, textureCoordinate); 


vec3 color3 = color.rgb; 

vec2 tc = (2.0 * textureCoordinate) - 1.0; 
float d = dot(tc, tc); 
vec2 lookup = vec2(d, color3.r); 

.. 
.. 
} 

但行之後,我的:

GLES20.glLinkProgram(program); 

本地崩潰:在0x00000060(代碼「致命信號11(SIGDEV)= 1),線程1231「 我猜這是因爲LG nexus 4使用GPU Adreno,它也崩潰了我的錯誤代碼14在不同的崩潰 - 使用太多的宏。

+0

如果我們正在尋找着色器代碼中的錯誤,則應該包含_complete_着色器代碼。這是缺少所有變量聲明,我假設你在最後留下了一些東西。另外一些應用程序代碼可能會有幫助 –

+0

可能是您的着色器代碼沒有編譯,因此您的程序無法鏈接。順便說一下,OpenGL ES沒有着色器,所以在這裏添加OpenGL ES標記並不重要。 – eozgonul

+0

請提供完整的着色器代碼。 – keaukraine

回答

2

編譯着色器之後,使用glGetShaderiv可以獲取着色器編譯的狀態。像:

GLint compiled; 
glGetShaderiv(index, GL_COMPILE_STATUS, &compiled); //index is the shader value 

然後,如果編譯的返回值爲0,得到的信息長度,然後再錯誤信息如下:

GLint infoLen = 0; 
glGetShaderiv(index, GL_INFO_LOG_LENGTH, &infoLen); 

if(infoLen > 1) 
{ 
    char* infoLog = new char(infoLen); 
    glGetShaderInfoLog(index, infoLen, NULL, infoLog); 
} 

檢查infoLog終於看到,從返回的錯誤信息着色器編譯。原始帖子中的分段錯誤消息不會給解決問題提供任何有用的信息。

+1

因爲我在鏈接程序時遇到了本地崩潰,所以無法進行此檢查。雖然 – Nativ

+1

我在鏈接程序前應該編譯你的着色器,所以你應該能夠獲得信息,但我確實使用了其他鏈接問題的信息。你可以在Android日誌上打印信息。 – eozgonul

1

據我可以從你的片段着色器中的短代碼摘錄中看到,你沒有指定float精度。在ES 2.0中,您必須明確指定float精度。

precision mediump float; 

請閱讀關於此in specs,p。 4.5.3默認精度限定符。 着色器可能無法在某些OpenGL ES驅動程序上指定float精度,並且可能無法在另一個上編譯。

但是,需要完整的源代碼才能找出問題的確切原因。

我建議你開始評論部分着色器代碼,直到它開始正確編譯。這樣你就可以縮小一個有問題的路線(我相信甚至比等待這裏的答案還要快)。

+1

嗨,我添加了上面的精度線。這不是問題 – Nativ

+0

保持冷靜並逐行評論,直到找到原因。 – keaukraine

相關問題