2013-03-30 10 views
7

मैं एक साधारण घन के अपने वर्तमान दृश्य में प्रकाश जोड़ने की कोशिश कर रहा हूं। vertex.glslओपनजीएल शेडर त्रुटि 1282

#version 120 

attribute vec4 coord3d; 
attribute vec3 normal3d; 

// output values that will be interpretated per-fragment 
varying vec3 fN; 
varying vec3 fE; 
varying vec3 fL; 

uniform vec4 lightPosition; 
uniform mat4 mTransform; 

void main() 
{ 
    fN = normal3d; 
    fE = coord3d.xyz; 
    fL = lightPosition.xyz; 

    if(lightPosition.w != 0.0) { 
    fL = lightPosition.xyz - coord3d.xyz; 
    } 

    gl_Position = mTransform*coord3d; 
} 

fragment.glsl

// per-fragment interpolated values from the vertex shader 
varying vec3 fN; 
varying vec3 fL; 
varying vec3 fE; 

uniform vec4 ambientProduct, diffuseProduct, specularProduct; 
uniform mat4 mTransform; 
uniform vec4 lightPosition; 
uniform float shininess; 

void main() 
{ 
    // Normalize the input lighting vectors 
    vec3 N = normalize(fN); 
    vec3 E = normalize(fE); 
    vec3 L = normalize(fL); 

    vec3 H = normalize(L + E); 

    vec4 ambient = ambientProduct; 

    float Kd = max(dot(L, N), 0.0); 
    vec4 diffuse = Kd*diffuseProduct; 

    float Ks = pow(max(dot(N, H), 0.0), shininess); 
    vec4 specular = Ks*specularProduct; 

    // discard the specular highlight if the light's behind the vertex 
    if(dot(L, N) < 0.0) { 
    specular = vec4(0.0, 0.0, 0.0, 1.0); 
    } 

    gl_FragColor = ambient + diffuse + specular; 
    gl_FragColor.a = 1.0; 
} 
:

GLuint ambientHandle = glGetUniformLocation(program->getHandle(), "ambientProduct"); 
glUniform4fv(ambientHandle, 1, ambientProduct); 
GLuint diffuseHandle = glGetUniformLocation(program->getHandle(), "diffuseProduct"); 
glUniform4fv(diffuseHandle, 1, diffuseProduct); 
GLuint specularHandle = glGetUniformLocation(program->getHandle(), "specularProduct"); 
glUniform4fv(specularHandle, 1, specularProduct); 
GLuint lightPosHandle = glGetUniformLocation(program->getHandle(), "lightPosition"); 
glUniform4fv(lightPosHandle, 1, light.position); 
GLuint shinyHandle = glGetUniformLocation(program->getHandle(), "shininess"); 
glUniform1f(shinyHandle, materialShininess); 

यहाँ मेरी वर्दी स्थापित करने के बाद मैं कोड के इस टुकड़े के लिए glGetError() से एक 1282 त्रुटि मिलती है मेरी shaders हैं

उत्पाद और स्थिति प्रत्येक तीन जीएलएफएलओट्स की संरचना है और चमक एक फ्लोट है। मैंने हैंडल के सभी मूल्यों और मूल्यों की जांच की है जो वे गुजर रहे हैं और वे सभी मान्य लगते हैं। विचार?

--EDIT: मैंने इसे glUniform4fv कॉल में संकुचित कर दिया है। यह प्रत्येक के बाद होता है। इसके अलावा मैंने दो बार जांच की है कि प्रोग्राम-> getHandle() किसी चीज़ को इंगित कर रहा है जो वैध दिखता है।

मैं जाँच की है प्रोग्राम> getHandle एक वैध कार्यक्रम है यहाँ सब हैंडल मान हैं: कार्यक्रम संभाल 3 ambientHandle 0 diffuseHandle 1 specularHandle 5 lightPosHandle 2 shinyHandle 4

तो वे सब अच्छा लगना। परीक्षण के लिए मैं परिवेश उत्पाद के लिए नीचे की रेखाओं पर टिप्पणी कर रहा हूं। स्पष्टता के लिए मैं स्पष्ट रूप से इस लाइन के बजाय

glUniform4f(ambientHandle, ambientProd.x, ambientProd.y, ambientProd.z, ambientProd.w); 

ये समय है कि रेखा के निष्पादित होने पर ambientProd के लिए मूल्य हैं उपयोग कर रहा हूँ। x = 0.200000003, y = 0.0, z = 0.200000003, w = 1.0

इस प्रोजेक्ट पर एक सहयोगी ने ग्लूसेप्रोग्राम के लिए कॉल को स्थानांतरित कर दिया। लोगों को मदद के लिए धन्यवाद।

+0

आपके टुकड़े शेडर के लिए '# संस्करण 'निर्देश कहां है? – genpfault

+0

गलती से – user2227713

उत्तर

10

त्रुटि संख्या '1282` बहुत वर्णनात्मक नहीं है। glGetUniformLocation के लिए

संभावित त्रुटि कोड हैं:

GL_INVALID_VALUE 
GL_INVALID_OPERATION 

कौन सा एक निश्चित मूल्य नहीं है। gluErrorString() के साथ त्रुटि स्ट्रिंग प्राप्त करने का प्रयास करें या उन 1282 मानचित्रों में से हेडर में एक नज़र डालें।

अंधेरे में बस एक गोली मार दी: लेकिन तुमने किया था ...

  • अपने शेडर जाँच त्रुटि के बिना संकलित कर ली?

  • अपने शेडर को बिना किसी त्रुटि के लिंक किया गया है?

Btw: वापसी प्रकार चमक GLuint नहीं

"संकलित और त्रुटि के बिना जुड़ा हुआ Shaders" हम्म, यह अजीब लग रहा है है।

कल्पना के अनुसार (देखें: http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml) GL_INVALID_OPERATION केवल उत्पन्न किया जाना चाहिए:

  • कार्यक्रम एक कार्यक्रम ओर्ब

  • कार्यक्रम को सफलतापूर्वक नहीं जोड़ा गया है नहीं है

अन्य प्रश्न:

  • क्या आप सुनिश्चित हैं कि getHandle() कक्षा का तरीका program ऑब्जेक्ट सही आईडी देता है। मेरा मतलब है कि एक जिसे सफलतापूर्वक जोड़ने में इस्तेमाल किया गया था। मैं अपने उदाहरण में glUniform4fv के उन कॉल याद किया - आह:

    आप अगर glIsProgram(program-getHandle()) रिटर्न GL_TRUE

संपादित जाँच के साथ सत्यापित करने के लिए सक्षम होना चाहिए।

glGetUniformLocation के लिए सही वापसी प्रकार अभी भी GLint है, लेकिन मुझे यह समस्या नहीं है।

कल्पना के अनुसार (देखें: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml) GLUniformXX कारणों की एक पूरी गुच्छा के लिए GL_INVALID_OPERATION उत्पन्न करता है। मेरे लिए केवल एक ही संभवतः लागू करने के लिए लगता है कि यह है:

  • कोई वर्तमान कार्यक्रम वस्तु

    आप glUseProgram (program->getHandle()) कॉल किया था glUniform() बुला की कोशिश कर रहा से पहले है?

+0

शेडर्स संकलित और त्रुटि के बिना जुड़े हुए हैं और यह GL_INVALID_OPERATION त्रुटि – user2227713

+4

है, मैंने आपके उदाहरण में 'glUniform()' को कॉल से चूक दिया - spec में सूचीबद्ध कारणों का एक वाह समूह है। आईएमएचओ कार्यक्रम सक्रिय नहीं है जो संभवतः लागू होता है जो संभवतः लागू होता है। – mikyra

+3

वाह, मैं वास्तव में glUseProgram को कॉल करना भूल गया। Tnx। – anhoppe

संबंधित मुद्दे