2

OpenGL のシェーダーに問題があります。

#ifdef GL_ES
precision lowp float;
#endif

varying vec4 v_fragmentColor;

void main()
{
    gl_FragColor = v_fragmentColor;
}

そして2つ目

attribute vec4 a_position;
attribute vec4 a_color;
uniform mat4 u_MVPMatrix;


#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
#else
varying vec4 v_fragmentColor;
#endif

void main()
{
    gl_Position = u_MVPMatrix * a_position;
    v_fragmentColor = a_color;
}

まず、2D 投影を行います

- (void)makeProjection2D
{
    float scaleFactor = 1.0;
    CGSize size = self.bounds.size;

    glViewport(0, 0, size.width, size.height);

    kmGLMatrixMode(KM_GL_PROJECTION);
    kmGLLoadIdentity();

    kmMat4 orthoMatrix;
    kmMat4OrthographicProjection(&orthoMatrix, 0, size.width / scaleFactor, 0, size.height / scaleFactor, -size.width, size.width);
    kmGLMultMatrix( &orthoMatrix );

    kmGLMatrixMode(KM_GL_MODELVIEW);
    kmGLLoadIdentity();
}

次のステップはシェーダーの作成です。

OpenGL の初期化が続きます。

GLint dim[2] = {1025, 769};
CGLSetParameter([[self openGLContext] CGLContextObj], kCGLCPSurfaceBackingSize, dim);
CGLEnable([[self openGLContext] CGLContextObj], kCGLCESurfaceBackingSize);

// Setup OpenGL states
glMatrixMode(GL_PROJECTION);
CGRect frame = self.bounds;

glGetError();

// Setup the view port in Pixels
glOrtho(0, frame.size.width, 0, frame.size.height, -1, 1);
glViewport(0, 0, frame.size.width, frame.size.height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnableClientState(GL_VERTEX_ARRAY);

glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

self.pointSize = pointSizeForDrawing;
GLint zeroOpacity = 0;
[[self openGLContext] setValues:&zeroOpacity forParameter:NSOpenGLCPSurfaceOpacity];

4つの大きなピクセルのようなものを画面に描画しようとすると

glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, framebuffer);

glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPointSize(100.0);
glColor3b(1.0, 1.0, 1.0);
GLfloat i[8] = {44.0, 44.0, 100.0, 100.0, 300.0, 300.0,  500.0, 500.0};

glVertexPointer(2, GL_FLOAT, 0, i);
glDrawArrays(GL_POINTS, 0, 4);

glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, framebuffer );
glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0 );
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height);
glBlitFramebufferEXT( 0, 0, self.bounds.size.width, self.bounds.size.height, 0, 0, self.bounds.size.width, self.bounds.size.height, GL_COLOR_BUFFER_BIT, GL_NEAREST );
glSwapAPPLE();

2D プロジェクションとシェーダーの作成を削除すると、4 つすべてが表示されます。

シェーダーを使用するコードは iOS では動作しますが、OSX では動作しません。シェーダーを初期化するには、cocos2d の CCGLProgram を使用します。さらに情報が必要な場合は、お知らせください。

4

0 に答える 0