CC_NODE_DRAW_SETUP()
CCGLProgram::setUniformsForBuiltins()
ccMacros.h
原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://jimmyzhouj.blog.51cto.com/2317513/884763
- //---------------------------------------------------
- //create a rectangle
- std::vector<float> geometryData;
- //vertex 0, left/buttom
- geometryData.push_back(-0.5); geometryData.push_back(-0.5); geometryData.push_back(0.0); geometryData.push_back(1.0);
- // 1, right/buttom
- geometryData.push_back(0.5); geometryData.push_back(-0.5); geometryData.push_back(0.0); geometryData.push_back(1.0);
- // 2, right/ups
- geometryData.push_back(0.5); geometryData.push_back(0.5); geometryData.push_back(0.0); geometryData.push_back(1.0);
- // 3, left/up
- geometryData.push_back(-0.5); geometryData.push_back(0.5); geometryData.push_back(0.0); geometryData.push_back(1.0);
- //generate an ID for our geometry buffer in the video memory and make it the active one
- glGenBuffers(1, &m_geometryBuffer);
- glBindBuffer(GL_ARRAY_BUFFER, m_geometryBuffer);
- //send the data to the video memory
- glBufferData(GL_ARRAY_BUFFER, geometryData.size() * sizeof(float), &geometryData[0], GL_STATIC_DRAW);
- //create a color buffer, to make our triangle look pretty
- std::vector<float> colorData;
- //3 floats define one color value (red, green and blue) with 0 no intensity and 1 full intensity
- //each color triplet is assigned to the vertex at the same position in the buffer, so first color -> first vertex
- //vertex 0 is red
- colorData.push_back(1.0); colorData.push_back(0.0); colorData.push_back(0.0);
- // 1 is blue
- colorData.push_back(0.0); colorData.push_back(0.0); colorData.push_back(1.0);
- // 2 is green
- colorData.push_back(0.0); colorData.push_back(1.0); colorData.push_back(0.0);
- // 3 is blue
- colorData.push_back(0.0); colorData.push_back(0.0); colorData.push_back(1.0);
- //generate an ID for the color buffer in the video memory and make it the active one
- glGenBuffers(1, &m_colorBuffer);
- glBindBuffer(GL_ARRAY_BUFFER, m_colorBuffer);
- //send the data to the video memory
- glBufferData(GL_ARRAY_BUFFER, colorData.size() * sizeof(float), &colorData[0], GL_STATIC_DRAW);
- //create vertex indices
- std::vector<GLubyte> indexData;
- //3 byte define 1 triangle
- indexData.push_back(0); indexData.push_back(1); indexData.push_back(2);
- indexData.push_back(2); indexData.push_back(3); indexData.push_back(0);
- m_indexNumber = indexData.size();
- //generate an ID for the index buffer in video memory
- glGenBuffers(1, &m_indexBuffer);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
- //send data to video memory
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexData.size() * sizeof(GLubyte), &indexData[0], GL_STATIC_DRAW);
- //initiate the drawing process, we want a triangle, start at index 0 and draw 3 vertices
- glDrawArrays(GL_TRIANGLES, 0, 3);
- //initiate the drawing process
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
- glDrawElements(GL_TRIANGLES, m_indexNumber, GL_UNSIGNED_BYTE, 0);
- // modelview
- uniform mat4 modelview;
- //the shader entry point is the main method
- void main()
- {
- colorVarying = color; //save the color for the fragment shader
- gl_Position = modelview * position; //copy the position
- }
- //modelview uniform in the shader
- int m_modelview;
- Lesson03.mm:
- //get the attachment points for modelview
- m_modelview = glGetUniformLocation(m_shader->getProgram(), "modelview");
- //check
- if (m_modelview < 0) {
- NSLog(@"Could not query uniform location");
- }
- //modelview
- CC3GLMatrix *mvMatrix = [CC3GLMatrix matrix];
- [mvMatrix populateFromTranslation:CC3VectorMake(0.2, 0 , 0)];
- m_currentRotation += 1.0;
- [mvMatrix rotateBy:CC3VectorMake(0, m_currentRotation, 0)];
- glUniformMatrix4fv(m_modelview, 1, 0, mvMatrix.glMatrix);