【发布时间】:2014-10-07 20:11:59
【问题描述】:
好的,所以我一直在努力解决这个问题,我已经设法在 OpenGLView 上进行子类化并绘制一些形状(正方形、三角形),并让它们在那里改变颜色等
现在我正在研究如何加载纹理数据并进行渲染,但我有点迷茫。
这是我尝试使用的代码,它似乎没有加载任何类型的纹理,我只是得到一个白框。我应该相信它会创建一个黑白复选框效果,但我似乎无法让它工作。
这是代码,非常感谢!
#import "MyOpenGLView.h"
#import <OpenGL/gl.h>
@implementation MyOpenGLView
static void drawAnObject ()
{
glEnable(GL_TEXTURE_2D);
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glPixelStorei(GL_UNPACK_ALIGNMENT, tex);
// Black/white checkerboard
float pixels[] = {
0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f
};
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
float color[] = { 1.0f, 0.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0.1, 0.1, 0, GL_RGB, GL_FLOAT, pixels);
glBindTexture (GL_TEXTURE_2D, tex);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);
glVertex3f (0.0, 0.0, 0.0);
glTexCoord2f (1.0, 0.0);
glVertex3f (10.0, 0.0, 0.0);
glTexCoord2f (1.0, 1.0);
glVertex3f (10.0, 10.0, 0.0);
glTexCoord2f (0.0, 1.0);
glVertex3f (0.0, 10.0, 0.0);
glEnd ();
}
-(void)awakeFromNib
{
renderTimer = [NSTimer timerWithTimeInterval:0.001 //a 1ms time interval
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:renderTimer
forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:renderTimer
forMode:NSEventTrackingRunLoopMode]; //Ensure timer fires during resize
}
// Timer callback method
- (void)timerFired:(id)sender
{
[self setNeedsDisplay:YES];
}
- (void)drawRect:(NSRect)dirtyRect {
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
drawAnObject();
glFlush();
GLint swapInterval = 1;
[[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
CVDisplayLinkCreateWithActiveCGDisplays(&displayLink);
}
原创
我正在为 OS X 开发一个 Cocoa 应用程序,其中我有一个大约 500px x 500px 的矩形,我需要以大约 25fps 的速度更改每个像素的颜色。
每个像素的颜色值将存储在一个 NSDictionary 中,可以在渲染每个像素时从中读取。
在最基本的意义上,我可以继承我正在绘制的 View 并覆盖 drawRect 方法。但是,我需要每秒调用 25 次,我怀疑这要求太多,而且它会陷入困境,它也不能保证渲染会在正确的时间发生。
所以我认为我需要使用 Core Graphics 或 OpenGL 在较低级别上执行此操作,但这些都是我之前没有花太多时间研究的大型主题。所以在我深入研究其中一个之前,有什么正确方向的指针吗?
【问题讨论】:
-
创建一个 OpenGL 纹理并用
glTexSubImage2Dopengl.org/sdk/docs/man/html/glTexSubImage2D.xhtml 在每一帧中写入数据。如果您的数据仅在 CPU 上可用,我没有看到更简单的解决方案。 -
是的,我担心它必须是那样的,好吧,我进入 OpenGL 的世界,祝我好运。 . .
-
好吧,已经很困惑了。据我所知,我需要将 RGB 数据加载到数组中并将其馈送到渲染的纹理中,但我没有概述将所有内容放在一起的一般构建块。我需要导入哪些库,如何创建渲染纹理的 OpenGL 视图以及如何告诉它更新。任何指向一些教程让我继续前进的指针将不胜感激?
标签: objective-c cocoa opengl core-graphics