使用OpenGL的新功能,我使用GL_LINE_LOOP在iOS 5上使用GLKit成功显示行,但使用GL_POINTS显示点给我带来了麻烦.具体来说,除了单个像素,我无法显示任何内容.我在网上搜索没有成功,所以我希望有人可以指出我缺少的东西.
这是我的测试代码......
//positions and colors, vertices and indices...
typedef struct {
float Position[2];
float Color[4];
} Vertex;
const Vertex Vertices[] = {
{{50, 50}, {0, 0, 1, 1}},
{{200, 50}, {0, 0, 1, 1}},
{{200, 200}, {0, 0, 1, 1}},
{{50, 200}, {0, 0, 1, 1}}
};
const GLubyte Indices[] = {
0, 1, 2, 3
};
@interface AppViewController() {
GLuint _vertexBuffer;
GLuint _indexBuffer;
}
...
//some unrelated properties, the @implementation and other methods
...
- (void)viewDidLoad {
[super …Run Code Online (Sandbox Code Playgroud) 我在iOS SDK 5.1中使用Xcode 4.3.2.
我想在我的故事板中创建一个视图控制器,它在半屏幕上包含GLKView,在另一半包含Buttons + Text.
我在UIViewController中尝试了put,但是可以让它工作.
有任何想法吗?文章?教程?
我想用OpenGL做一些简单的图像处理,所以我开始使用GLKView.由于我不需要每隔几秒刷新一次视图,我没有使用GLKViewController和而是使用普通的UIViewController子类.
我的问题是,我只是将viewController的视图作为一个GLKView或者GLKView作为视图控制器视图的子视图添加.由于我UISlider也在视图中添加了一个,我认为后者似乎更好,但我不确定.我还需要setNeedsDisplay在某些情况下调用GLKView.
我正在尝试在iOS上学习OpenGL.我正在学习本教程.
http://www.raywenderlich.com/5235/beginning-opengl-es-2-0-with-glkit-part-2
我确定我会仔细按照步骤操作,但是当我走到尽头时,屏幕上看不到任何形状.
https://gist.github.com/seanhess/5356598
我确实看到背景颜色在变化,所以OpenGL一般都在工作.只是对glDrawElements的调用似乎没有做任何事情.
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
Run Code Online (Sandbox Code Playgroud)
他有一些演示代码,但它与你在教程中编写的代码不一样,我想了解为什么在粘贴之前这不起作用.
应该在哪里绘制GLKBaseEffect?我看不出我们是如何使用它的.
我正在尝试移植一个使用SFML和OpenGL的c ++程序,我将其从Windows写入Mac OS X.我正在使用g ++在两个平台上进行编译.
这是我目前用于计算投影矩阵的代码:
void perspectiveCalculate (int width, int height) {
// Prevent A Divide By Zero
if (height<1) height=1;
if (width<1) width=1;
glViewport(0, 0, width, height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
//field of vision , width , height , near clipping , far clipping
//and calculate The Aspect Ratio Of The Window
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset …Run Code Online (Sandbox Code Playgroud) 我试图从UIImage中裁剪一个区域以与GLKTextureLoader一起使用.我可以使用UIImage直接设置纹理,如下所示:
- (void)setTextureImage:(UIImage *)image
{
NSError *error;
texture = [GLKTextureLoader textureWithCGImage:image.CGImage options:nil error:&error];
if(error)
{
NSLog(@"Texture Error:%@", error);
} else {
self.textureCoordinates[0] = GLKVector2Make(1.0f, 1.0f);
self.textureCoordinates[1] = GLKVector2Make(1.0f, 0);
self.textureCoordinates[2] = GLKVector2Make(0, 0);
self.textureCoordinates[3] = GLKVector2Make(0, 1.0f);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试以这种方式裁剪图像:
- (void)setTextureImage:(UIImage *)image
{
NSError *error;
CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0.0, 64.0f, 64.0f, 64.0f));
texture = [GLKTextureLoader textureWithCGImage:imageRef options:nil error:&error];
if(error)
{
NSLog(@"[SF] Texture Error:%@", error);
} else {
self.textureCoordinates[0] = GLKVector2Make(1.0f, 1.0f);
self.textureCoordinates[1] = GLKVector2Make(1.0f, 0);
self.textureCoordinates[2] = GLKVector2Make(0, …Run Code Online (Sandbox Code Playgroud) 我试图用OpenGL ES 2.0 GLKit绘制一条线.当我运行以下代码并使用OpenGL ES Analyzer时,我收到以下错误:
"使用不存在的程序"glDrawArrays(GL_LINE_STRIP,0,4)
"GL错误:无效操作"GL_INVALID_OPERATION < - glVertexPointer(2,GL_FLOAT,0,NULL)GL_INVALID_OPERATION < - glEnableClientState(GL_VERTEX_ARRAY)
这是我的代码:
#import "GLDrawingView.h"
const float data[] = {0.0f, 1.0f, 0.0f, 0.0f, 1.0f, -0.0f, 0.0f, 1.0f};
@interface GLDrawingView () {
GLuint lineVBO;
}
@end
@implementation GLDrawingView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[EAGLContext setCurrentContext:self.context];
glGenBuffers(1, &lineVBO);
glBindBuffer(GL_ARRAY_BUFFER, lineVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
}
return self;
}
- (void)drawRect:(CGRect)rect
{
glVertexPointer(2, GL_FLOAT, 0, NULL);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_LINE_STRIP, 0, sizeof(data) / sizeof(float) / 2);
}
@end
Run Code Online (Sandbox Code Playgroud) 我想用 GLKit 绘制半透明图元。我已经通过禁用深度测试glDisable(GL_DEPTH_TEST)并通过启用混合
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
现在,对于较大的 alpha 值(例如 0.9),我需要首先绘制最远的三角形,这样它们就不会出现在较近的三角形上方。glBlendFunc 的文档中也说明了这一点:
透明度最好使用混合函数(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA)来实现,其中图元从最远到最近排序。请注意,此透明度计算不需要帧缓冲区中存在 alpha 位平面
在应用程序中使用深度缓冲时,您需要注意渲染图元的顺序。需要首先渲染完全不透明的图元,然后按从后到前的顺序渲染部分不透明的图元。如果不按此顺序渲染图元,则通过部分不透明图元可见的图元可能会完全失去深度测试。
但由于视角可以改变(当我改变渲染效果时modelViewMatrix),从远到近的顺序取决于当前的视角。
有没有办法让 OpenGL 以正确的顺序自动渲染我的图元,如果没有,最好的方法是什么?我认为计算 z 位置(取决于当前视角)并为每帧订购几千个三角形(或者更准确地说,每次视角变化时,可以是每帧)的成本太高,特别是当我需要为每一帧将此订单推送到 GPU 时。
请注意,我不关心使用纹理(只是彩色顶点)。
我想制作一个使用OpenGL ES 2.0的应用程序.我可以在不使用GLKit的情况下执行此操作,因为我想将其部署到iOS 4.3吗?我找不到任何关于此的参考.是否可以在没有GLKit的情况下使用着色器等?
谢谢
我有一个简单的 GLKViewController,我将屏幕设为白色:
- (void)viewDidLoad {
[super viewDidLoad];
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
GLKView *view = (GLKView *)self.view;
view.context = self.context;
[EAGLContext setCurrentContext:self.context];
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
}
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用。
但是,如果我将 glClear 调用移动到 drawInRect,则它可以工作:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClear(GL_COLOR_BUFFER_BIT);
}
Run Code Online (Sandbox Code Playgroud)
这是为什么?为什么必须在 drawInRect 中调用 glClear 而不是 glClearColor ?
所以我在手机上设置了一个简单的模拟.目标是在屏幕上显示带有各种透明度的红色,白色和蓝色圆圈.我有大部分工作,除了一件事,而透明度的工作,唯一的混合发生在黑色背景.结果,中心的圆圈显示为深红色,而不是在其下方显示白色圆圈.我究竟做错了什么?
注意我正在使用正交2d投影矩阵.所有对象z位置都相同,并以特定顺序呈现.
以下是我如何设置透明度的方法:
glEnable(GLenum(GL_DEPTH_TEST))
glEnable(GLenum(GL_POINT_SIZE));
glEnable(GLenum(GL_BLEND))
glBlendFunc(GLenum(GL_SRC_ALPHA), GLenum(GL_ONE_MINUS_SRC_ALPHA))
glEnable(GLenum(GL_POINT_SMOOTH))
//Note some of these things aren't compatible with OpenGL-es but they can hurt right?
Run Code Online (Sandbox Code Playgroud)
这是片段着色器:
precision mediump float;
varying vec4 outColor;
varying vec3 center;
varying float o_width;
varying float o_height;
varying float o_pointSize;
void main()
{
vec4 fc = gl_FragCoord;
vec3 fp = vec3(fc);
vec2 circCoord = 2.0 * gl_PointCoord - 1.0;
if (dot(circCoord, circCoord) > 1.0) {
discard;
}
gl_FragColor = outColor;//colorOut;
}
Run Code Online (Sandbox Code Playgroud)
以下是我将每个圆圈传递给着色器的方法:
func drawParticle(part: Particle,color_loc: GLint, size_loc: GLint) …Run Code Online (Sandbox Code Playgroud) glkit ×11
ios ×8
opengl-es ×6
iphone ×3
c++ ×1
cgimage ×1
cgimageref ×1
geometry ×1
objective-c ×1
opengl ×1
swift ×1
transparency ×1
uiimage ×1