Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL没有在Mac上绘制任何东西,Objective-C_Objective C_C_Macos_Opengl_Shader - Fatal编程技术网

OpenGL没有在Mac上绘制任何东西,Objective-C

OpenGL没有在Mac上绘制任何东西,Objective-C,objective-c,c,macos,opengl,shader,Objective C,C,Macos,Opengl,Shader,我正在尝试使用OpenGL和VAO和VBO对象绘制一些东西。为此,我只对NSOpenGLView进行了子类化。默认情况下,使用的是OpenGL v2.1,因此,我使用了PixelFormat,编写了代码,并解决了所有打印错误。目前,该应用程序运行良好,但窗口中没有任何内容,即使glClearColor也没有效果。请帮我找到并解决问题。我的操作系统是Mac v10.12和OpenGL v4.1 myopenlview.m,第1部分: #import "MyOpenGLView.h" #includ

我正在尝试使用OpenGL和VAO和VBO对象绘制一些东西。为此,我只对
NSOpenGLView
进行了子类化。默认情况下,使用的是OpenGL v2.1,因此,我使用了
PixelFormat
,编写了代码,并解决了所有打印错误。目前,该应用程序运行良好,但窗口中没有任何内容,即使
glClearColor
也没有效果。请帮我找到并解决问题。我的操作系统是Mac v10.12和OpenGL v4.1

myopenlview.m,第1部分:

#import "MyOpenGLView.h"
#include <OpenGL/gl3.h>
#include "error.h"

static const char *vertexShaderSource =
"#version 410\n"
"in vec3 posAttr;\n"
"in vec3 colAttr;\n"
"out vec3 col;\n"
"void main() {\n"
"   col = colAttr;\n"
"   gl_Position.xyz = posAttr;\n"
"   gl_Position.w = 1.0;\n"
"   col = colAttr;\n"
"}\n";

static const char *fragmentShaderSource =
"#version 410\n"
"in vec3 col;\n"
"out vec4 color;\n"
"void main() {\n"
"   color.rgb = col;\n"
"   color.a = 1.0;\n"
//"   color = vec4(1,1,1,1);\n"
"}\n";

// Shader properties
GLuint m_posAttr;
GLuint m_colAttr;
GLuint program;

// Arrays of positions and colors
float fTriangle[9];
float fTriangleColor[9];

// Low-level VBOs and VBAs
GLuint uiVBO[2];
GLuint uiVAO[1];


GLuint makeShader(GLenum type, const char *source) {
    GLuint shader;

    shader = glCreateShader(type);
    GetError();
    glShaderSource(shader, 1, &source, NULL);
    GetError();
    glCompileShader(shader);
    GetError();

#if defined(DEBUG)
    GLint logLength;

    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
    GetError();
    if (logLength > 0) {
        GLchar *log = malloc((size_t)logLength);
        glGetShaderInfoLog(shader, logLength, &logLength, log);
        GetError();
        NSLog(@"Shader compilation failed with error:\n%s", log);
        free(log);
    }
#endif

    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    GetError();
    if (0 == status) {
        glDeleteShader(shader);
        GetError();
        NSLog(@"Shader compilation failed from code!");
        assert(0);
    }

    return shader;
}
//// Prints OpenGL errors

#ifndef __ERROR_H__
#define __ERROR_H__

#include <stdlib.h>
#include <assert.h>

#ifdef  DEBUG

#define GetError( )\
{\
for ( GLenum Error = glGetError( ); ( GL_NO_ERROR != Error ); Error = glGetError( ) )\
{\
switch ( Error )\
{\
case GL_INVALID_ENUM:      printf( "\n%s\n\n", "GL_INVALID_ENUM"      ); assert( 0 ); break;\
case GL_INVALID_VALUE:     printf( "\n%s\n\n", "GL_INVALID_VALUE"     ); assert( 0 ); break;\
case GL_INVALID_OPERATION: printf( "\n%s\n\n", "GL_INVALID_OPERATION" ); assert( 0 ); break;\
case GL_OUT_OF_MEMORY:     printf( "\n%s\n\n", "GL_OUT_OF_MEMORY"     ); assert( 0 ); break;\
default:                                                                              break;\
}\
}\
}

#else

#define GetError( )

#endif /*   DEBUG     */
#endif /* __ERROR_H__ */
错误。h:

#import "MyOpenGLView.h"
#include <OpenGL/gl3.h>
#include "error.h"

static const char *vertexShaderSource =
"#version 410\n"
"in vec3 posAttr;\n"
"in vec3 colAttr;\n"
"out vec3 col;\n"
"void main() {\n"
"   col = colAttr;\n"
"   gl_Position.xyz = posAttr;\n"
"   gl_Position.w = 1.0;\n"
"   col = colAttr;\n"
"}\n";

static const char *fragmentShaderSource =
"#version 410\n"
"in vec3 col;\n"
"out vec4 color;\n"
"void main() {\n"
"   color.rgb = col;\n"
"   color.a = 1.0;\n"
//"   color = vec4(1,1,1,1);\n"
"}\n";

// Shader properties
GLuint m_posAttr;
GLuint m_colAttr;
GLuint program;

// Arrays of positions and colors
float fTriangle[9];
float fTriangleColor[9];

// Low-level VBOs and VBAs
GLuint uiVBO[2];
GLuint uiVAO[1];


GLuint makeShader(GLenum type, const char *source) {
    GLuint shader;

    shader = glCreateShader(type);
    GetError();
    glShaderSource(shader, 1, &source, NULL);
    GetError();
    glCompileShader(shader);
    GetError();

#if defined(DEBUG)
    GLint logLength;

    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
    GetError();
    if (logLength > 0) {
        GLchar *log = malloc((size_t)logLength);
        glGetShaderInfoLog(shader, logLength, &logLength, log);
        GetError();
        NSLog(@"Shader compilation failed with error:\n%s", log);
        free(log);
    }
#endif

    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    GetError();
    if (0 == status) {
        glDeleteShader(shader);
        GetError();
        NSLog(@"Shader compilation failed from code!");
        assert(0);
    }

    return shader;
}
//// Prints OpenGL errors

#ifndef __ERROR_H__
#define __ERROR_H__

#include <stdlib.h>
#include <assert.h>

#ifdef  DEBUG

#define GetError( )\
{\
for ( GLenum Error = glGetError( ); ( GL_NO_ERROR != Error ); Error = glGetError( ) )\
{\
switch ( Error )\
{\
case GL_INVALID_ENUM:      printf( "\n%s\n\n", "GL_INVALID_ENUM"      ); assert( 0 ); break;\
case GL_INVALID_VALUE:     printf( "\n%s\n\n", "GL_INVALID_VALUE"     ); assert( 0 ); break;\
case GL_INVALID_OPERATION: printf( "\n%s\n\n", "GL_INVALID_OPERATION" ); assert( 0 ); break;\
case GL_OUT_OF_MEMORY:     printf( "\n%s\n\n", "GL_OUT_OF_MEMORY"     ); assert( 0 ); break;\
default:                                                                              break;\
}\
}\
}

#else

#define GetError( )

#endif /*   DEBUG     */
#endif /* __ERROR_H__ */
///打印OpenGL错误
#ifndef错误__
#定义错误__
#包括
#包括
#ifdef调试
#定义GetError()\
{\
对于(GLenum Error=glGetError();(GL_NO_Error!=Error);Error=glGetError())\
{\
开关(错误)\
{\
案例GL\u无效枚举:printf(“\n%s\n\n”,“GL\u无效枚举”);断言(0);中断\
案例GL\u无效值:printf(“\n%s\n\n”,“GL\u无效值”);断言(0);中断\
案例GL_无效_操作:printf(“\n%s\n\n”,“GL_无效_操作”);断言(0);中断\
大小写GL_OUT OF_MEMORY:printf(“\n%s\n\n”,“GL_OUT OF_MEMORY”);断言(0);中断\
默认:中断\
}\
}\
}
#否则
#定义GetError()
#endif/*调试*/
#endif/*\错误\u H\u*/

经过大量的努力和代码的修改,我找到了答案:唯一真正的问题是
NSOpenGLPFADoubleBuffer
数组中的
nsopenglpixelformattribute
选项。在对该选项进行注释后,我得到了所需的输出


在我看来,原因是我有两个输出图形缓冲区。然而,代码只执行一次,第一个缓冲区被绘制,然后交换。因此,第二个缓冲区是空的,被绘制出来。

我看到的第一件事是,你必须在
glClear
之前调用
glClearColor
。否则就没有效果。下一步:在VAO设置代码->VAO中未存储任何信息->VAO绑定后绑定VAO,并重置所有内容。下一步:不应在每个帧中重新创建VAO和VBO。它们应该被生成一次,然后用于绘图方法。因为有很多不同的东西看起来是错误的,所以你应该考虑找一个好的教程。我将尝试解决它并更新问题。我搜索了好的教程,但只找到了旧的。我试着跟着