最简单、简约、opengl 3.2 cocoa项目

2024-01-12

我已经使用旧版 openGL 和 cocoa 多年了,但现在我正在努力过渡到 openGL 3.2。互联网上有几个例子,但它们都太复杂了(许多甚至在 XCode 5.1 下不再编译)。有人可以编写一个最简单、简约、最小的可可代码示例,只是为了将读取三角形绘制到 NSOpenGLView 吗? (没有花哨的着色器,没有显示回调,代码行越少越好)。


这是基于中代码的答案https://github.com/beelsebob/Cocoa-GL-Tutorial https://github.com/beelsebob/Cocoa-GL-Tutorial我更改了这些内容: (1) openGL 上下文是在自定义 NSOpenGLView 中创建的,而不是直接附加到窗口。 (2) 我将所有初始化都放在一个函数中。 (3)我把错误验证码全部删除了。这不是你应该为产品做的事情,但我发现更容易理解代码,并且更少的混乱......(查看 Cocoa-GL-Tutorial 以进行正确的错误处理)。

步骤(使用 Xcode 5.1 测试):

  1. 制作新的可可应用程序
  2. 将自定义视图添加到界面生成器中的应用程序窗口
  3. 添加一个 Objective-C 类,子类化 NSOpenGLView,我将其命名为 MyOpenGLView
  4. 在界面构建器中,选择 CustomView,选择 Identity Inspector(右上角的图标之一),然后在 Custom Class 中选择 MyOpenGLView
  5. 现在,这是代码MyOpenGLView.h:



    #import <Cocoa/Cocoa.h>
    #import <OpenGL/OpenGL.h>
    #import <OpenGL/gl3.h>

    @interface MyOpenGLView : NSOpenGLView
    {
        GLuint shaderProgram;
        GLuint vertexArrayObject;
        GLuint vertexBuffer;

        GLint positionUniform;
        GLint colourAttribute;
        GLint positionAttribute;
    }
    @end

  

这是代码MyOpenGLView.m:




    #import "MyOpenGLView.h"

    @implementation MyOpenGLView

    - (id)initWithFrame:(NSRect)frame
    {
        // 1. Create a context with opengl pixel format
        NSOpenGLPixelFormatAttribute pixelFormatAttributes[] =
        {
            NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
            NSOpenGLPFAColorSize    , 24                           ,
            NSOpenGLPFAAlphaSize    , 8                            ,
            NSOpenGLPFADoubleBuffer ,
            NSOpenGLPFAAccelerated  ,
            NSOpenGLPFANoRecovery   ,
            0
        };
        NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes];
        self = [super initWithFrame:frame pixelFormat:pixelFormat];

        // 2. Make the context current
        [[self openGLContext] makeCurrentContext];

        // 3. Define and compile vertex and fragment shaders
        GLuint  vs;
        GLuint  fs;
        const char    *vss="#version 150\n\
        uniform vec2 p;\
        in vec4 position;\
        in vec4 colour;\
        out vec4 colourV;\
        void main (void)\
        {\
        colourV = colour;\
        gl_Position = vec4(p, 0.0, 0.0) + position;\
        }";
        const char    *fss="#version 150\n\
        in vec4 colourV;\
        out vec4 fragColour;\
        void main(void)\
        {\
        fragColour = colourV;\
        }";
        vs = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vs, 1, &vss;, NULL);
        glCompileShader(vs);
        fs = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fs, 1, &fss;, NULL);
        glCompileShader(fs);
        printf("vs: %i, fs: %i\n",vs,fs);

        // 4. Attach the shaders
        shaderProgram = glCreateProgram();
        glAttachShader(shaderProgram, vs);
        glAttachShader(shaderProgram, fs);
        glBindFragDataLocation(shaderProgram, 0, "fragColour");
        glLinkProgram(shaderProgram);

        // 5. Get pointers to uniforms and attributes
        positionUniform = glGetUniformLocation(shaderProgram, "p");
        colourAttribute = glGetAttribLocation(shaderProgram, "colour");
        positionAttribute = glGetAttribLocation(shaderProgram, "position");
        glDeleteShader(vs);
        glDeleteShader(fs);
        printf("positionUniform: %i, colourAttribute: %i, positionAttribute: %i\n",positionUniform,colourAttribute,positionAttribute);

        // 6. Upload vertices (1st four values in a row) and colours (following four values)
        GLfloat vertexData[]= { -0.5,-0.5,0.0,1.0,   1.0,0.0,0.0,1.0,
                                -0.5, 0.5,0.0,1.0,   0.0,1.0,0.0,1.0,
                                 0.5, 0.5,0.0,1.0,   0.0,0.0,1.0,1.0,
                                 0.5,-0.5,0.0,1.0,   1.0,1.0,1.0,1.0};
        glGenVertexArrays(1, &vertexArrayObject;);
        glBindVertexArray(vertexArrayObject);

        glGenBuffers(1, &vertexBuffer;);
        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glBufferData(GL_ARRAY_BUFFER, 4*8*sizeof(GLfloat), vertexData, GL_STATIC_DRAW);

        glEnableVertexAttribArray((GLuint)positionAttribute);
        glEnableVertexAttribArray((GLuint)colourAttribute  );
        glVertexAttribPointer((GLuint)positionAttribute, 4, GL_FLOAT, GL_FALSE, 8*sizeof(GLfloat), 0);
        glVertexAttribPointer((GLuint)colourAttribute  , 4, GL_FLOAT, GL_FALSE, 8*sizeof(GLfloat), (char*)0+4*sizeof(GLfloat));

        return self;
    }

    - (void)drawRect:(NSRect)dirtyRect
    {
        [super drawRect:dirtyRect];

        glClearColor(0.0, 0.0, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(shaderProgram);
        GLfloat p[]={0,0};
        glUniform2fv(positionUniform, 1, (const GLfloat *)&p;);
        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

        [[self openGLContext] flushBuffer];
    }

    @end

  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最简单、简约、opengl 3.2 cocoa项目 的相关文章

  • 10.11 NSCollectionView - 动态确定单元格大小

    OS X v10 11 AppKit 发行说明 https developer apple com library mac releasenotes AppKit RN AppKit 10 11CollectionView建议可以根据每个项
  • 使用 PRODUCT_NAME 构建 cocoapods 项目的 xcodebuild 失败

    我可以使用以下命令构建我的 Cocoapods 项目 base basename xcworkspace xcworkspace xcodebuild sdk iphonesimulator ios version CONFIGURATIO
  • 更新到 SDK 1.3.1 后未捕获 GMSMapView 上的拖动/平移手势

    我在通过手势识别器捕获 GMSMapView 上的拖动 平移手势时遇到了一个奇怪的问题 此问题仅在从 GMS 1 2 更新到 1 3 1 后才出现 其中 引用文档 https developers google com maps docum
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 在 Cocoa/Carbon 下调试 NULL CGContext

    在执行程序期间 我在 XCode 调试控制台中得到以下输出
  • 为什么 WebView 中的 dataWithPDFInsideRect 不能在 Mavericks 上创建高质量的 PDF?

    Run 示例项目 https github com tvarghese TestWebView并观察桌面上生成的输出 PDF 名为保存网页 pdf 粘贴感兴趣的代码片段 NSURL url NSBundle mainBundle URLFo
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 为什么在 10.5 上我必须在 NSWindowController 上调用 showWindow 两次?

    我有一个 NSWindowController 的子类 我用它从笔尖加载窗口并将其显示在屏幕上 下面是当我想显示窗口时调用的代码 在 10 6 上 当调用 showCustomWindow 时 会显示窗口 但在 10 5 上 必须调用此方法
  • 如何生成Mac应用程序的安装包?

    如何为 OS X 二进制文件以及一些配置和脚本文件创建单个安装程序包 最终文件夹应如下所示 任何帮助 将不胜感激 谢谢 如果您希望将各种东西放置在不同的位置 安装程序在这里 文档在那里 支持文件在这里等等 它们也非常适合提供安装体验的可配置
  • 如何从 DTrace 脚本打印 NSString

    This question https stackoverflow com questions 1413623 how do i print a cfstringref in a dtrace action正在问同样的事情 但是当我尝试时
  • 如何将字符串从 Applescript 传递到 Objective C

    我正在开发一个应用程序 我需要能够传递一个字符串变量 from 苹果脚本 to 目标C 我已经弄清楚如何从 Objective C 类中的方法运行 Applescript 但我需要能够将 NSString 设置为 Applescript 中
  • GLSL NVidia 方形神器

    当 GLSL 着色器在以下 GPU 上生成不正确的图像时 我遇到了问题 GT 430 GT 770 GTX 570显卡760 但在这些上正常工作 英特尔高清显卡 2500英特尔高清4000英特尔4400显卡740MRadeon HD 631
  • 为每行 NSTableView 文本着色

    我有一个 NSTableView 它显示我拥有的对象数组 对于每个对象 行 我想根据在每个对象上运行的函数的结果来更改显示的文本的颜色 因此 例如表中存在于另一个列表 或其他一些要求 中的所有对象 我想以绿色文本显示它们 不存在的对象以红色
  • 使用基于约束的布局自动调整 NSTokenField 的大小

    有没有办法自动调整大小height使用约束的 NSTokenField 保持宽度恒定 sizeToFit应该有效 但事实并非如此 如果我设置一个约束来保持宽度不变并调用此方法 它将忽略约束并仅调整宽度大小 当我想要的是仅调整高度大小时 基于
  • 存储 OpenGL 状态

    假设我正在尝试用 C 制作某种小型 opengl 图形引擎 我读过通过访问 opengl 状态glGet 函数可能非常昂贵 虽然访问 opengl 状态似乎是一个经常操作 并且强烈建议将 opengl 状态的副本存储在具有快速读 写访问权限
  • 使用 JOGL 和 Android OpenGL 编写可移植 Java 应用程序

    我计划编写一款可以在 PC 和 Android 上运行的 Java 3D 游戏 不幸的是 这两个平台似乎没有通用的 OpenGL API API 是否有显着差异 有没有办法在两个版本中使用相同的 3D 代码 这是不是一个好主意 Androi
  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • OpenGL 3.1 中已弃用 glLineStipple

    glLineStipple在最新的 OpenGL API 中已被弃用 它被替换成什么 如果不更换 怎样才能达到类似的效果呢 我当然不想使用兼容性配置文件 抱歉 它还没有被任何东西取代 我想到的第一个模拟它的想法是几何着色器 您向几何着色器提
  • gdb 声称它不知道如何运行

    我在 Mac Pro 上的 Mac OS X 10 6 6 上使用 Xcode 3 2 3 来构建 GrowlTunes 的修订版 5fd480ef577f咆哮开发存储库 http growl info hg growl developme

随机推荐

  • 如何检查 Selenium Server 是否正在运行

    我有一堆 phpunit 测试 其中一部分使用 selenium 我需要知道 selenium 服务器是否正在运行 Windows 有没有办法从php检查它 默认情况下 Selenium 服务器接受本地主机端口 4444 上的命令 所以你可
  • “Csc.exe”退出,代码为-1073741819

    每次我尝试运行我的代码时 都会遇到此错误 Csc exe 退出 代码为 1073741819 我清理了我的解决方案并重新启动了 Visual Studio 但没有任何收获 谁能帮我 我遇到了同样的问题 删除项目中的 bin 和 obj 文件
  • 如何在 Spring Data JPA 中编写动态原生 SQL 查询?

    我需要在 Spring Boot Web 应用程序中的数据库中的多个表上编写搜索查询 它使用 spring data jpa 我知道我们可以使用 Query 注释和 native true 标志在 spring data jpa 中编写本机
  • 实体框架核心:无法添加迁移:没有无参数构造函数

    我的数据项目参考 Entity Framework Core
  • 有效检测损坏的 jpeg 文件?

    有没有一种有效的方法来检测 jpeg 文件是否损坏 背景资料 解决方案需要在 php 脚本内工作jpeg 文件位于磁盘上无法手动检查 用户上传的数据 我知道imagecreatefromjpeg string filename 可以做到 但
  • Python ascii utf Unicode

    当我解析这个 XML 时p xml parsers expat ParserCreate
  • 使用 OAuth 时 Instagram 返回“未找到匹配代码或已使用”

    我正在尝试使用Instagram OAuth使用开发人员文档 https www instagram com developer authentication https www instagram com developer authen
  • 在元素后插入仅打开的 HTML 标签?

    我想在页面上的 H1 元素后面插入几个开始 DIV 标记 而不插入相应的结束标记 因为结束标记包含在我无权访问的包含页脚文件中 IE 现有代码 h1 Heading One h1 page content 新代码 h1 Heading On
  • Nginx 重写或内部重定向循环,同时内部重定向到“/index.html”

    我使用 Php 框架在 nginx 上实现 Web 服务器 没有任何 index html 网页工作正常 但某些脚本无法工作 它显示 500 内部服务器错误 这是服务器日志 2016 11 16 11 08 38 错误 2551 0 738
  • Google Play 应用内结算版本 3:因“已拥有的项目”而崩溃并缺少失败通知

    在 最终 发布 Google Play 应用内结算的 v2 实现之后 除了发布后的问题之外 我什么也没遇到 交易失败 崩溃 无法恢复 诸如 无法下载 您已经拥有该项目 之类的疯狂错误 以及各种其他荒谬的事情 老实说 我现在已经在 iOS A
  • MultipartFormDataStreamProvider 清理

    如果文件发布到我的网络应用程序 那么我通过以下方式读取它们MultipartFormDataStreamProvider FileData 我像这样初始化提供者 string root HttpContext Current Server
  • Spring Ldap - 多个基本名称

    我正在尝试使用 spring LDAP ODM 从 LDAP 接收一些属性 有没有办法在中配置多个基本名称
  • Sprintf 重复值

    这是一个简单的问题 我需要在 sprintf 函数中复制值 sprintf s s s arg1 arg1 arg2 我怎样才能只传递 arg1 一次 似乎无法在 php net 上找到答案 Thanks Andrew 使用索引格式 1 s
  • 如何通过代理连接不和谐机器人

    我正在尝试使用discord py 并通过代理运行discord 机器人 这关于此的不一致文档 https discordpy readthedocs io en latest api html highlight proxy discor
  • 如何从 VB6 .frx 文件中提取图像?

    我正在将一些 VB6 代码转换为 C VB6 将资源存储在 frx文件 与 C 存储它的方式相同 resx文件 如何将图像转换为 frx文件到可以嵌入的东西 resx file 这是部分答案 有一个实用程序可用于执行提取部分 Gfx来自Fr
  • Rails 中的 j 函数有什么作用?

    我刚刚发现一个博客提到jRails 中的函数 他们用它来进行 ajax 样式的页面更新 cart html 我知道他们正在使用部分来渲染cart部分 但有什么意义j 我发现一些文章说它将字符串转换为 JavaScript 可以接受的内容 但
  • 滚动视图中的线性布局不占据整个高度

    我有一个线性布局说V1 在L1内部我有一个滚动视图V2 在滚动视图内部我有另一个线性布局V3 现在V3有一个gridtview V4 PBM 是 如果我的列表视图有 6 个项目 则只有 2 个项目可见 对于其余的 即使我看到有足够的空白空间
  • 如何以非阻塞的方式组合可观察量?

    我有一个 Observables 集合 每个 Observables 检索不同的数据类型 我将这些 Observable 链接起来以获取页面所需的所有数据 事实上 所有这些信息都是独立的 因此加载一个信息不应阻止或干扰加载其他信息 这是我无
  • 查找两个网页之间的最短路径

    我需要找到两个维基百科页面之间的最短距离 以 跃点 为单位 我有一种方法可以提取页面上的所有内部 wiki 链接 我知道起始目的地和结束目的地 但我对如何从数据中提取跃点一无所知 到目前为止 我一直在使用链接提取方法来填充字典 其中键是页面
  • 最简单、简约、opengl 3.2 cocoa项目

    我已经使用旧版 openGL 和 cocoa 多年了 但现在我正在努力过渡到 openGL 3 2 互联网上有几个例子 但它们都太复杂了 许多甚至在 XCode 5 1 下不再编译 有人可以编写一个最简单 简约 最小的可可代码示例 只是为了