如果有人能够了解这里出了什么问题,也许是对gl命令或其他一些不兼容的命令序列的错误排序,我将非常感谢你的帮助.尽管谷歌在“OpenGL ES 2.0编程指南”中进行了大量研究和研究,但我一直试图让这段代码整天都没有成功.

我正在尝试在iPhone上的OpenGL ES 2.0中使用顶点缓冲区对象和自定义着色器.我试图交错来自以下类型的一系列自定义结构的顶点数据:

typedef struct {
    float x,y; // Position.
    float radius;
    float colR,colG,colB,colA; // Color rgba components.
} VType;

位置,半径和颜色字节分别考虑顶点位置,点大小和颜色.这些的ID已初始化:

ID_ATT_Pos = 0;
ID_ATT_Radius = 1;
ID_ATT_Color = 2;
// Note: I have also tried values of 1,2,3 but no difference.

这些的步幅在每个glVertexAttribPointer调用中指定.

意图是每个顶点在其x,y位置绘制,具有指定的颜色和半径的点数.与每个上述属性相关联的是顶点着色器属性,它们是“a_position”,“a_color”和“a_radius”.以下是顶点和片段着色器:

VertexShader.txt

attribute vec2 a_position;      
attribute vec4 a_color;     
attribute float a_radius;       
varying vec4 v_color;
void main()
{
    gl_Position = vec4(a_position,0.0,1.0);
    gl_PointSize = a_radius;
    v_color = a_color;
}

FragmentShader.txt

#ifdef GL_FRAGMENT_PRECISION_HIGH
    precision highp float;
#else
    precision mediump float;
#endif
void main()
{
    gl_FragColor = vec4(1.0,1.0);
}

我想知道顶点着色器中是否需要投影矩阵?我创建的所有点都是iPhone屏幕尺寸的2D,正如您所看到的,它们每个都在上面的顶点着色器中附加’z,w’作为’0.0,1.0′.

下面列出了使用glDrawElements设置VBO和渲染的剩余核心代码.当运行此代码时,很明显glClear已经成功,并且NSLog打印确实确认了这一点,但是视口中没有通过下面列出的DrawFrame代码绘制VType顶点.顶点坐标完全在屏幕尺寸内,例如x,y:(92,454).

请注意,以下代码中的任何未声明的变量都是类属性,并且具有适当的类型,例如’vao’是gluint,’vbos’是gluint [2],’program’是gluint程序句柄.我还遗漏了样板OpenGL设置代码,该代码已经过不同代码内部测试并显示可以工作.

加载着色器代码

-(gluint)loadShaderType:(GLenum)type From:(Nsstring*)shaderFile {
    gluint shader;
    GLint compiled;

    // Create and compile vertex shader.
    Nsstring *filepath = [[NSBundle mainBundle] pathForResource:shaderFile ofType:@"txt"];

    const GLchar *shaderSrc = (GLchar *)[[Nsstring stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:nil] UTF8String];
    if (!shaderSrc) {
        NSLog(@"Failed to load vertex shader");
        return 0;
    }

    // Create shader object.
    shader = glCreateShader(type);
    if (shader == 0) return 0;
    // Load shader source.
    glShaderSource(shader,1,&shaderSrc,NULL);
    // Compile shader.
    glCompileShader(shader);
    // Check compile status.
    glGetShaderiv(shader,GL_COMPILE_STATUS,&compiled);

    if (!compiled) {
        GLint infoLen = 0;
        glGetShaderiv(shader,GL_INFO_LOG_LENGTH,&infoLen);

        if (infoLen > 1) {
            char * infoLog = (char*)malloc(sizeof(char)*infoLen);
            glGetShaderInfoLog(shader,infoLen,NULL,infoLog);
            NSLog(@"Error compiling shader:\n%s\n",infoLog);
            free(infoLog);
        }
        glDeleteShader(shader);
        return 0;
    }
    return shader;
}

初始化代码

GLfloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
GLfloat screenWidth = [[UIScreen mainScreen] bounds].size.width;

glViewport(0,screenWidth,screenHeight);


glGenVertexArraysOES(1,&vao);
glBindVertexArrayOES(vao);

// Generate buffer,bind to use Now,set initial data.
glGenBuffers(2,vbos);

glBindBuffer(GL_ARRAY_BUFFER,vbos[0]);
glBufferData(GL_ARRAY_BUFFER,vxBufSize,squidVxs,GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vbos[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,ixBufSize,squidIxs,GL_STATIC_DRAW);

glEnabLevertexAttribArray(ID_ATT_Pos); // Pos   
glVertexAttribPointer(ID_ATT_Pos,GL_FLOAT,GL_FALSE,sizeof(VType),BUFFER_OFFSET(0));
glEnabLevertexAttribArray(ID_ATT_Radius);// Radius
glVertexAttribPointer(ID_ATT_Radius,BUFFER_OFFSET(sizeof(float)*2));
glEnabLevertexAttribArray(ID_ATT_Color);// Color
glVertexAttribPointer(ID_ATT_Color,4,BUFFER_OFFSET(sizeof(float)*3));

gluint shaders[2];
shaders[0] = [self loadShaderType:GL_VERTEX_SHADER From:@"VertexShader"];
shaders[1] = [self loadShaderType:GL_FRAGMENT_SHADER From:@"FragmentShader"];

program = glCreateProgram();
glAttachShader(program,shaders[0]);
glAttachShader(program,shaders[1]);

glBindAttribLocation(program,ID_ATT_Pos,"a_position");
glBindAttribLocation(program,ID_ATT_Radius,"a_radius");
glBindAttribLocation(program,ID_ATT_Color,"a_color");

glLinkProgram(program);

GLint linked;
glGetProgramiv(program,GL_LINK_STATUS,&linked);

if (!linked) {
    GLint infoLen = 0;
    glGetProgramiv(program,&infoLen);
    if (infoLen > 1) {
        char* infoLog = (char*)malloc(sizeof(char)*infoLen);
        glGetProgramInfoLog(program,infoLog);
        NSLog(@"Error linking program:\n%s\n",infoLog);
        free(infoLog);
    }
    glDeleteProgram(program);
}

DrawFrame代码

// Note: Framebuffer swapping is taken care of before/after these
//       lines,and has been shown to work.
glClearColor(0.33f,0.0f,0.33f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
gluseProgram(program);
glDrawElements(GL_POINTS,numPoints,GL_UNSIGNED_SHORT,BUFFER_OFFSET(0));

如果需要任何其他信息,请告诉我,谢谢你的时间.

解决方法

您不一定需要2d顶点的投影矩阵,但您肯定需要将所有3个坐标转换为[-1,1]范围(通过将其设置为0已经为z做了).然后,GL使用当前视口转换(通常应与屏幕尺寸匹配)转换这些坐标.因此,如果坐标在屏幕尺寸中,则在着色器中将它们转换为[-1,1],或者仅在应用程序中使用[-1,1]坐标(这也将更加与分辨率无关).

编辑:我不知道OpenGL ES如何处理这个问题,但是在桌面GL(至少高达2.1)中你需要为顶点着色器调用glEnable(GL_VERTEX_PROGRAM_POINT_SIZE)以便能够控制点大小.

为什么这个OpenGL ES 2.0着色器不能在iOS上使用我的VBO?的更多相关文章

  1. ios – 痛苦地减慢软件向量,特别是CoreGraphics与OpenGL

    )在这个实验之后,我切换到了OpenGL和MonkVG库,我感到非常高兴.我现在可以在没有任何帧速率下降的情况下同时渲染HUNDREDS曲线,对保真度的影响很小.>我是否有可能以某种方式滥用CoreGraphics,或者性能真的那么糟糕?我的预感是问题在于CoreGraphics,基于StackOverflow/论坛问题的数量以及有关CG性能的答案.从技术上讲,为什么会这样呢?>如果CoreGraphics真的那么慢,Safari究竟如何顺利地工作?OpenGL在早餐时吃这个测试.矢量绘图怎么可能如此慢得

  2. 为什么这个OpenGL ES 2.0着色器不能在iOS上使用我的VBO?

    如果有人能够了解这里出了什么问题,也许是对gl命令或其他一些不兼容的命令序列的错误排序,我将非常感谢你的帮助.尽管谷歌在“OpenGLES2.0编程指南”中进行了大量研究和研究,但我一直试图让这段代码整天都没有成功.我正在尝试在iPhone上的OpenGLES2.0中使用顶点缓冲区对象和自定义着色器.我试图交错来自以下类型的一系列自定义结构的顶点数据:位置,半径和颜色字节分别考虑顶点位置,点大小和

  3. ios – 为什么Apple建议在串行后台队列中调度OpenGL命令,这不可避免地会导致崩溃?

    他们suggest:WhenusingGCD,useadedicatedserialqueuetodispatchcommandstoOpenGLES;thiscanbeusedtoreplacetheconventionalmutexpattern.我不明白这个建议.我无法解决这种冲突:当应用程序的app委托收到-applicationWillResignActive调用时,它必须立即停止调用任

  4. iOS:是否在OpenGL上实现Core Graphics?

    我发现一个图表显示了在OpenGL上执行的CoreGraphics,另一个将它放在OpenGL旁边.我会认为,苹果会聪明地给每个图形硬件的平等访问,但是再次,我不太了解他们正在使用的图形芯片…也许是3D一直吗?这里有人知道具体细节吗?

  5. ios – OpenGL – 为什么GL_ELEMENT_ARRAY_BUFFER的索引?

    我目前是OpenGLES2.0领域的新手,希望尽可能地了解绑定,缓冲区,着色器等.截至目前,我只是想了解GL_ELEMENT_ARRAY_BUFFER和GL_ARRAY_BUFFER之间的差异,以及何时使用每个注释的预设.我目前的理解使我相信GL_ELEMENT_ARRAY_BUFFER是专门用于所述三角形的索引,而另一个则是其他的.有人可以详细说明为什么,如果这是正确的?GL_ELEMENT_A

  6. ios – 有没有办法加速iPad模拟器的OpenGL性能?

    iPad模拟器太慢,无法测试OpenGL图形.有没有办法让它更快?

  7. ios – 将两个字符串转换为一组布尔值的快速方法是什么?

    我有一个长字符串,我想转换为一个布尔值数组.而且它需要很多次,很快.我天真的尝试是这样的:但这比我想要的要慢很多.我的剖析告诉我,地图是减速的地方,但我不知道我能做多么简单.我觉得如果没有Swift’s/ObjC的开销,这样做会很快.在C中,我认为这是一个简单的循环,其中一个字节的内存与一个常量进行比较,但我不知道我应该看的是什么函数或语法.有更好的办法吗?

  8. 在iOS上默认是char签名还是未签名?

    默认情况下,iOS上是否签名或未签名?(我认为这将是一个很好的回答问题,但奇怪的是谷歌没有任何用处!

  9. xcode – 在Mac上使用OpenGL ES功能

    我试图将opengl绘制到2d空间,并且正在执行以下操作,但它不会编译:我已经包含了OpenGL.framework框架,编译器跟踪说明如下.我已经没有关于如何解决它的想法.我的目标是目前的桌面应用程序,但我的目标是最终制作一个iPhone应用程序.解决方法你有没有包含适当的标题?在Mac上,这些是可能在iPhone上他们是另外,如果我没弄错的话,glOrthof()是特定于OpenGL-ES的.您可能需要在Mac上使用glOrtho().

  10. ios – OpenGL ES 2.0在iPad / iPhone上的视频

    如果任何人有任何建议或OpenGL的工作代码示例–>视频将是惊人的…

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部