- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果有人能阐明这里出了什么问题,可能是 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”。下面是顶点和片段着色器:
顶点着色器.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,0.0,0.0,1.0);
}
我想知道顶点着色器是否需要投影矩阵?我创建的所有点在 iPhone 屏幕的维度上都是二维的,正如您所看到的,它们在上面的顶点着色器中都附加了 'z,w' 作为 '0.0,1.0'。
下面列出了设置 VBO 和使用 glDrawElements 渲染的剩余核心代码。运行此代码时,可以明显看出 glClear 已经成功,并且 NSLog 打印确实证实了这一点,但是下面列出的 DrawFrame 代码没有在视口(viewport)中绘制 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, 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, 2, GL_FLOAT, GL_FALSE, sizeof(VType), BUFFER_OFFSET(0));
glEnableVertexAttribArray(ID_ATT_Radius);// Radius
glVertexAttribPointer(ID_ATT_Radius, 1, GL_FLOAT, GL_FALSE, sizeof(VType), BUFFER_OFFSET(sizeof(float)*2));
glEnableVertexAttribArray(ID_ATT_Color);// Color
glVertexAttribPointer(ID_ATT_Color, 4, GL_FLOAT, GL_FALSE, sizeof(VType), 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, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1) {
char* infoLog = (char*)malloc(sizeof(char)*infoLen);
glGetProgramInfoLog(program, infoLen, NULL, 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] 范围内(您已经通过将 z 设置为 0 完成了此操作)。然后,这些坐标由 GL 使用当前视口(viewport)转换(通常应与您的屏幕尺寸相匹配)进行转换。因此,如果坐标在屏幕尺寸中,则在着色器中将它们转换为 [-1,1],或者仅在应用程序中使用 [-1,1] 坐标(这也将与分辨率无关)。
编辑:我不知道 OpenGL ES 如何处理这个问题,但在桌面 GL(至少高达 2.1)中,您需要调用 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE)
顶点着色器能够更改点大小。
关于ios - 为什么这个 OpenGL ES 2.0 着色器不能与我在 iOS 上的 VBO 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7231935/
我必须在文本区域上绘制哪些选项? 我认识一些所见即所得的编辑器。我不确定他们使用的方法是什么,并且会看看他们以了解,但我知道像 tinymce 这样的事情已经存在了一段时间,所以我猜现在可能有更现代的
我在我的 woo commerce 商店页面中创建了一个子类别排序菜单。我想将链接到我现在所在页面的链接设置为红色。我对 css 没有问题,只是用 js 脚本。我怎样才能让它突出当前?这是我创建的排序
所以我使用 TextWrangler4.5.3 并主要使用 Python 编写脚本。当我编写 Python 时,我经常喜欢发表类似这样的评论:# BEGINS foo 然后是 # ENDS foo 我
我需要你的帮助! 我有一个表格,里面有行(姓名等)现在,当位于该行上的对象具有特定值时,我想为特定的 tableCells 背景着色。但我只得到它来读取这个单元格的值。但我需要阅读对象(在我的代码中称
有人知道在 uikit 中给 uiactionsheet 着色吗? 最佳答案 是的,因为它是一个 UIView(如 kmit 所述),您可以使用以下命令:addSubview,因此您可以添加自己的背景
在 vba 中,我想从工作表中的单元格中读取颜色来为条形图中的特定条形着色。我的问题是我的颜色格式为 4F9F92,但要在 makro 中读取它,我需要使用单元格中的 excel 颜色代码 40762
我正在尝试绘制一个 geom_histogram,其中条形图由渐变着色。 这就是我想要做的: library(ggplot2) set.seed(1) df <- data.frame(id=past
我正在构建一个带有 shiny 的应用程序,并使用与 Shiny gallery ( http://shiny.rstudio.com/gallery/slider-bar-and-slider-ra
在 iOS 6 和 xcode 4 中,我有这个: https://dl.dropboxusercontent.com/u/60718318/photo.PNG使用代码可以轻松创建 [editButt
我正在向我的 iPhone UI 添加自定义按钮,并希望使它们具有 Apple 应用程序中的玻璃外观。我有一个很好的默认玻璃图像,但我不想为我想要的每种色调(红色、绿色、蓝色等)都有一个单独的图像。
我到处寻找但没有找到解决方案。我有图像 1。如何以编程方式使用渐变对它们进行着色以获得图像 2 和 3?以下是这些图像: 我通过 Photoshop 应用到它们的色调是简单的 2 色线性渐变。 我的问
有没有办法告诉 OS X 自动设置 NSToolbarItem 的样式/色调? 我通过 IB/Xcode 添加了一个“图像工具栏项”,并将图标设置为黑色 PDF as described in the
我试图区分列范围图表上的多种类型的数据。问题是我希望能够按多个标准对它们进行分组。 我可以轻松地为不同的列着色,从而解决一个问题,但我希望能够根据我传递到图表的数据,为 xAxis 上的类别(图表是倒
有人在编译模式 Emacs 中添加了对 ansi-color 的支持吗?如果是这样,颜色写入程序必须检查什么属性/属性才能确保其事件终端支持 ANSI 转义着色。 最佳答案 已经有一个函数可以将颜色应
我正在尝试实现 Phong 着色模型,但我不确定如何选择光源。更具体地说,我不明白光源应该是什么样子。它应该是vec3吗?或者也许是我在 Java 代码中定义的矩阵?另外,如果我们假设我希望相机作为光
我有 2 个 dhtmlxSidebars,就像示例中一样 here如何为嵌套背景设置不同的背景颜色?如果我添加CSS .dhxsidebar_side { background-color:
我有一个 JTable,每行都根据最后一列中的值着色。 但是,当我单击标题对行进行排序时,颜色不会跟随行。 我尝试在 JTable 鼠标退出事件上调用我的“colourTable”方法(我知道 Hac
geom_hline 似乎忽略了美观,我错过了什么还是这是一个错误? df session 信息: R version 3.4.4 (2018-03-15) Platform: x86_64-pc-
这个问题已经有答案了: How to draw a BufferedImage with a color tint (1 个回答) 已关闭 8 年前。 如何将通过此处的图标着色为不同的颜色?假设我想拍
我想为除我点击的那个之外的所有 div 着色。在我的代码中它有效,但只有一次。如果我点击另一个 div,它不起作用。 http://jsfiddle.net/6VhK8/353/ id="1
我是一名优秀的程序员,十分优秀!