2012-06-04 6 views
10

मैंने this प्रश्न देखा और यह वास्तव में कुछ प्रकाश डाला। इसके बावजूद, मुझे यह पता लगाना प्रतीत नहीं होता कि मैं अपने शेडर को "अनुचित तरीके से" कैसे लोड कर रहा हूं, क्योंकि में शेडर लोडिंग कोड में हालिया परिवर्तन किए बिना पहले निष्पादित किया गया है, इसलिए मुझे लगता है कि ये त्रुटियां मेरे ड्रॉ से आनी चाहिए कहता है।

इसके बावजूद, मैं अभी भी शराब के लिए शेडर फ़ाइलों को पोस्ट करूंगा, ड्रॉ फ़ंक्शन जो सर्कल को प्रस्तुत करने की कोशिश कर रहा हूं, और कोड जो शेडर फ़ाइल में स्ट्रिंग के रूप में लोड होता है, को खींचने के लिए उपयोग किया जाता है।

असल में मुझे यह जानने की ज़रूरत है कि मुझे इन त्रुटियों को क्यों मिल रहा है और उनके साथ क्या गलत है?

(डिबग आउटपुट से)

ERROR { 
    OpenGL Says: 
    Vertex info 
----------- 
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>" 

Fragment info 
------------- 
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>" 

}; 

ड्रा कोड

void Circle::draw(GLuint program) 
    { 
     const size_t centerMag = mCenter.length(); 

     glUseProgram(program); 

     for(float t = 0; t < mCircumference; t += 0.1) 
     { 
      float x = centerMag + glm::cos(2 * M_PI * t); 
      float y = centerMag + glm::sin(2 * M_PI * t); 

      mVertices->push_back(glm::vec4(x, y, 0, 1)); 
     } 

     QListIterator<glm::vec4> iVertices(*mVertices); 

     const size_t size = mVertices->size(); 

     float** verts = new float*[ size ]; 

     size_t i = 0; 

     glEnableClientState(GL_VERTEX_ARRAY); 

     while(iVertices.hasNext()) 
     { 
      verts[ i ] = new float[ size ]; 
      verts[ i ] = const_cast< float* >(glm::value_ptr(iVertices.next())); 

      glVertexPointer(4, GL_FLOAT, 0, verts[ i ]); 

      glDrawArrays(GL_LINES, 0, 4); 

      ++i; 
     } 

     glDisableClientState(GL_VERTEX_ARRAY); 

     for(unsigned iMem = 0; iMem < size; ++iMem) 
     { 
      delete[] verts[ iMem ]; 
      verts[ iMem ] = NULL; 
     } 

     delete[] verts; 
     verts = NULL; 
    } 

FileUtility

QString FileUtility::readShader(QString filepath) 
    { 
     std::ifstream in(filepath.toStdString().c_str()); 
     std::stringstream shaderDat; 

     shaderDat << in.rdbuf(); 

     QString shaderFile; 

     shaderFile += shaderDat.str().c_str(); 

     in.close(); 

     return shaderFile; 
    } 

GenericColor.frag

#version 330 

out vec4 outputColor; 

void main() 
{ 
    outputColor = vec4(1.0f, 0, 0, 1.0f); 
} 

Position.vert

#version 330 

layout(location = 0) in vec4 position; 

void main() 
{ 
    gl_Position = position; 
} 

अद्यतन

चूंकि मेरे शेडर बाध्यकारी/संकलन कोड का अनुरोध किया गया था, मैं मैं भी सिर्फ पोस्ट कर सकते हैं लगा मेरी पूरे शेडर हैंडलर, साथ ही साथ इंजन वर्ग।

- Engine - ShaderHandler

Info { 
    Shader Source #version 330 

in uniform mvp; 

layout(location = 0) in vec4 position; 

void main() 
{ 
    gl_ModelViewProjectionMatrix = mvp; 
    gl_Position = position; 
} 




}; 



Info { 
    Shader Source #version 330 

out vec4 outputColor; 

void main() 
{ 
    outputColor = vec4(1.0f, 0, 0, 1.0f); 
} 


}; 
+0

क्या आप शेडर संकलन/वीए बाध्यकारी कोड भी दिखा सकते हैं? –

+0

अपडेट किया गया, मैंने पूरी स्रोत फ़ाइल पेस्टबिन करने का निर्णय लिया। – zeboidlund

+0

धन्यवाद, मुझे एक नज़र आएगी। –

उत्तर

17

उस त्रुटि संदेश का अर्थ है कि शेडर कंपाइलर शेडर की पहली पंक्ति पर एक कचरा चरित्र (एक प्रिंट करने योग्य ASCII चरित्र, एक स्थान, एक टैब, या एक नई लाइन के अलावा कुछ) देख रहा है। सबसे अधिक संभावना है कि आप जिस स्ट्रिंग को glShaderSource पर गुजर रहे हैं वह कचरा है - शायद एक लटकने वाला सूचक जो एक बार आपके शेडर कोड पर इंगित करता है लेकिन अब कुछ नष्ट होने के कारण नहीं होता है।

संपादित

मैं अपने लिंक से देख आप कोड है कि लग रहा है जैसे:

s.Source = shader.toStdString().c_str(); 

कि s.Source एक अस्थायी std::string वस्तु की आंतरिक बफर कि कुछ ही समय बाद नष्ट हो जाएगा पर इशारा करते हुए सेट हो जाएगा इस लाइन, s.Source को एक खतरनाक सूचक छोड़कर ...

+0

आपको धन्यवाद। भगवान, कभी-कभी मुझे इस तथ्य से नफरत है कि मैं सी # पृष्ठभूमि से आया हूं। – zeboidlund

+0

एक और मामला नोट: यह मेरे साथ भी हुआ, लेकिन अंत में ** गायब \ 0 टर्मिनेटर ** के साथ, इसलिए मैं इसे अपने कथन में जोड़ रहा हूं ** ** "शेडर की पहली पंक्ति पर ** ** **। – Wappenull

+0

@Wappenull: एक लापता एनयूएल आम तौर पर आपको पहले की बजाय शेडर की * आखिरी * रेखा पर त्रुटि देगा। त्रुटि संदेश की शुरुआत में कोष्ठक में संख्या रेखा संख्या है (अभिभावक से पहले संख्या ग्लशरसोर्स को पारित सरणी में अनुक्रमणिका है) –

2

मेरा अनुमान है:: मैं glLoadMatrix() देखा है अपने कोड में कॉल जो मूल रूप से मतलब है

अद्यतन

यहाँ शेडर तार पार्स (Info एक डिबग आउटपुट है) कर रहे हैं आप पुराने (प्री-3.1) जीएल एपीआई का उपयोग कर रहे हैं और जीएल 3.1 कोर प्रोफाइल संदर्भ को सही ढंग से प्रारंभ नहीं करते हैं।

यह उस स्थिति की ओर जाता है जहां आपका संदर्भ GLSL1.50 + और "स्थान" विशेषताओं (इस प्रकार शेडर कंपाइलर से त्रुटि) का समर्थन नहीं करता है।

जीएल के प्रारंभिक परिवर्तन को बदलने का प्रयास करें और फिर glBindAttribLocation कॉल की जांच करें। GlLoadMatrix सामग्री का उपयोग करने से बचें - इसके बजाए शेडर वर्दी का उपयोग करें।

एक जीएल 3.1 संदर्भ निर्माण नमूना के लिए opengl.org की साइट देखें: http://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_(C%2B%2B/Win)। यह जीएल 2 से थोड़ा अलग है।0-

1

यह शायद अपने वर्तमान समस्या से संबंधित नहीं है, लेकिन एक जल्द ही हो जाएगा:

verts[ i ] = new float[ size ]; 
verts[ i ] = const_cast< float* >(glm::value_ptr(iVertices.next())); 

पहली पंक्ति में आबंटित स्मृति लीक कर रहा है, इसके अलावा, जब आप delete कुछ पंक्तियां के बाद फोन , आप new द्वारा दिए गए मान को हटा रहे हैं लेकिन जाली वाला एक। क्या यही मतलब है तुम्हारा ?

1

मुझे यह त्रुटि मिली क्योंकि मैंने कुछ शेडर कोड काट दिया और पेस्ट किया एक वेबसाइट। मुझे लगता है कि एलएफ/सीआर में अंतर समस्या पैदा कर रहा था। काम में मैन्युअल रूप से टाइप किए गए कोड के साथ पेस्ट किए गए टेक्स्ट को हटाकर।

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