2012-10-23 96 views
4

我有幾個例子需要在PC上運行。問題在於它們是用glsl target 150編寫的,而我的電腦只支持版本120.我很確定程序本身足夠簡單,不需要任何OpenGL 3.1的擴展功能。我已經找到了一些有關應該採取什麼措施來轉換glsl(即改變屬性,改爲改變)但它仍然沒有編譯的信息(實際上是否有可能以某種方式從中獲得有意義的錯誤信息?)。將glsl 150轉換爲120

原.vert

#version 150 
in vec2 in_Position; 
in vec3 in_Color; 
out vec3 ex_Color; 
void main(void) { 
    gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0); 
    ex_Color = in_Color; 
} 

原.frag

#version 150 
precision highp float; 

in vec3 ex_Color; 
out vec4 gl_FragColor; 

void main(void) { 
    gl_FragColor = vec4(ex_Color,1.0); 
} 

改變.vert

#version 120 
attribute vec2 in_Position; 
attribute vec3 in_Color; 
varying vec3 ex_Color; 
void main(void) { 
    gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0); 
    ex_Color = in_Color; 
} 

改變.frag

#version 120 
precision highp float; 

attribute vec3 ex_Color; 

void main(void) { 
    gl_FragColor = vec4(ex_Color,1.0); 
} 

所以任何人都可以在這裏發現問題嗎?

+0

您是否有任何錯誤信息可以在您的問題中引用,無論您是否有意義? –

+2

「*是否真的有可能以某種方式得到一個有意義的錯誤信息?*」[你有沒有得到信息?](http://www.opengl.org/wiki/GLSL_Object#Error_handling) –

+0

最初我只是有一條消息說,我正在連接一個未編譯的着色器,沒有別的。 – Homulvas

回答

4

要獲得編譯/鏈接錯誤消息,您需要使用着色器的命令glGetShaderInfoLog和程序的glGetProgramInfoLog命令。

這些會告訴你你的特定錯誤是什麼。

只是在刺探錯誤可能是什麼,你聲明attribute輸入片段着色器,我相信應該是varying。屬性用於數據 - >頂點着色器,變化用於頂點着色器 - >片段着色器。

glsl 120規範還提到精度限定符「保留供將來使用」,因此它可能不適用於版本120.您可以不必使用它。

但是,您仍然應該熟悉infolog功能,無論如何,最終您肯定會需要它們。

+0

謝謝。你發現了我的兩個問題。我沒有得到的一件事是,當我們只是重寫舊版本的所有內容時,這個屬性和變化是如何工作的。我知道out> vary和in>屬性。在這種情況下最初的代碼是錯誤的還是我錯過了其他的東西? – Homulvas

+1

*我知道out> vary和in>屬性。*,這對於頂點着色器是正確的,而不是對於片段着色器。變化被輸入到片段着色器。 – Tim

3

你可以通過檢索 「信息記錄」 編譯錯誤:

GLuint nVertexShader, nPixelShader; // handles to objects 
GLint vertCompiled, fragCompiled; // status values 
GLint linked; 

glCompileShader(nVertexShader); 
glGetShaderiv(nVertexShader, GL_COMPILE_STATUS, &vertCompiled); 

如果vertCompiled(或fragCompile)== 0,這樣做是爲了看看爲什麼:

int infologLength = 0; 
int charsWritten = 0; 

glGetShaderiv(nVertexShader, GL_INFO_LOG_LENGTH, &infologLength); 

if (infologLength > 0) 
{ 
    GLchar* infoLog = (GLchar *)malloc(infologLength); 
    if (infoLog == NULL) 
    { 
     printf("ERROR: Could not allocate InfoLog buffer"); 
     exit(1); 
    } 
    glGetShaderInfoLog(nVertexShader, infologLength, &charsWritten, infoLog); 
    printf("Shader InfoLog:\n%s", infoLog); 
    free(infoLog); 
} 

你可以做同樣的鏈接,只需檢查鏈接== 0並檢索日誌如上:

glLinkProgram(m_nProgram); 
glGetProgramiv(m_nProgram, GL_LINK_STATUS, &linked); 
+0

謝謝我想,從長遠來看,您的答案將比我的問題的解決方案更有價值。 – Homulvas

1
precision highp float; 

這在GLSL 1.20中不合法。我甚至不知道它爲什麼放在1.50着色器中,因爲精確限定符只在GLSL ES中做有用的事情,而且不能與GLSL ES共享1.50着色器。