- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是第二天,我尝试使用带有着色器的 OpenGL 3.3
绘制一个三角形,但我无法让它工作。没有错误消息被打印出来。我还使用调试器遍历了每一行,并且 GL_GetError()
始终保持 0
(无错误),除了紧接在 glewInit()
调用之后,但人们说没关系。我不知道代码或我的电脑有什么问题。我使用 lubuntu 15.04
和 glxinfo | grep "OpenGL"
打印
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Bay Trail
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.5.9
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 10.5.9
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 10.5.9
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
OpenGL ES profile extensions:
这是我的程序,只有 100 LOC,没有任何外部依赖:
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
GLuint VBO;
GLuint prog;
const GLchar *vert_shader_src =
"#version 330\n"
"layout (location = 0) in vec3 Position;\n"
"void main() {\n"
"gl_Position = vec4(0.5*Position.x, 0.5*Position.y, Position.z, 1.0); }\n";
const GLchar *frag_shader_src =
"#version 330\n"
"out vec4 FragColor;\n"
"void main() {\n"
"FragColor = vec4(1.0, 0.0, 0.0, 1.0); }";
void render(void) {
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(prog);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glutSwapBuffers(); }
void initGlut(int *argc_ptr, char **argv, void (*renderCallback)(void)) {
glutInit(argc_ptr, argv);
glutInitContextVersion(3, 3);
glutInitWindowSize(600, 600);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("minigl");
glutDisplayFunc(renderCallback); }
void initVBO(void) {
float pts[9] = {-1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f};
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(pts), pts, GL_STATIC_DRAW); }
int initProg(void) {
prog = glCreateProgram();
GLuint vshade = glCreateShader(GL_VERTEX_SHADER);
GLuint fshade = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar **v_src = &vert_shader_src;
const GLchar **f_src = &frag_shader_src;
int v_src_len_ptr[1] = { strlen(vert_shader_src) };
int f_src_len_ptr[1] = { strlen(frag_shader_src) };
glShaderSource(vshade, 1, v_src, v_src_len_ptr);
glShaderSource(fshade, 1, f_src, f_src_len_ptr);
glCompileShader(vshade);
glCompileShader(fshade);
GLint success;
glGetShaderiv(vshade, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetShaderInfoLog(vshade, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Err compiling shader: '%s'\n", infolog); }
glGetShaderiv(fshade, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetShaderInfoLog(fshade, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Err compiling shader: '%s'\n", infolog); }
glAttachShader(prog, vshade);
glAttachShader(prog, fshade);
glLinkProgram(prog);
glGetProgramiv(prog, GL_LINK_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetProgramInfoLog(prog, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Error linking shader program: '%s'\n", infolog); }
glValidateProgram(prog);
glGetProgramiv(prog, GL_VALIDATE_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetProgramInfoLog(prog, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Error validating shader program: '%s'\n", infolog); }
glDeleteShader(vshade);
glDeleteShader(fshade);
return 1; }
int main(int argc, char **argv) {
initGlut(&argc, argv, render);
// GL_GetError throws 1280 (invalid enum) after glewInit but all say it's OK
if(glewInit() != GLEW_OK) {
puts("GLEW failed to initialize!");
return EXIT_FAILURE; }
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
initProg();
glutMainLoop();
glDeleteProgram(prog);
glDeleteBuffers(1, &VBO);
return EXIT_SUCCESS; }
顺便说一句,我已经下载了这个Github repo最小的 OpenGL 3.3 示例,它工作得很好。我看到的唯一主要区别是除了 VBO 之外还使用了 VAO。
编辑:添加了 VAO,移植到 GLFW - 仍然是同样的问题。
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
GLuint VBO;
GLuint VAO;
GLuint prog;
const GLchar *vert_shader_src =
"#version 330\n"
"layout (location = 0) in vec3 Position;\n"
"void main() {\n"
"gl_Position = vec4(0.5*Position.x, 0.5*Position.y, Position.z, 1.0); }\n";
const GLchar *frag_shader_src =
"#version 330\n"
"out vec4 FragColor;\n"
"void main() {\n"
"FragColor = vec4(1.0, 0.0, 0.0, 1.0); }";
void render(GLFWwindow *window) {
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(prog);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glfwSwapBuffers(window); }
void initVBO(void) {
float pts[9] = {-1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f};
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(pts), pts, GL_STATIC_DRAW); }
int initProg(void) {
prog = glCreateProgram();
GLuint vshade = glCreateShader(GL_VERTEX_SHADER);
GLuint fshade = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar **v_src = &vert_shader_src;
const GLchar **f_src = &frag_shader_src;
int v_src_len_ptr[1] = { strlen(vert_shader_src) };
int f_src_len_ptr[1] = { strlen(frag_shader_src) };
glShaderSource(vshade, 1, v_src, v_src_len_ptr);
glShaderSource(fshade, 1, f_src, f_src_len_ptr);
glCompileShader(vshade);
glCompileShader(fshade);
GLint success;
glGetShaderiv(vshade, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetShaderInfoLog(vshade, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Err compiling shader: '%s'\n", infolog); }
glGetShaderiv(fshade, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetShaderInfoLog(fshade, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Err compiling shader: '%s'\n", infolog); }
glAttachShader(prog, vshade);
glAttachShader(prog, fshade);
glLinkProgram(prog);
glGetProgramiv(prog, GL_LINK_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetProgramInfoLog(prog, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Error linking shader program: '%s'\n", infolog); }
glValidateProgram(prog);
glGetProgramiv(prog, GL_VALIDATE_STATUS, &success);
if (!success) {
GLchar infolog[1024];
glGetProgramInfoLog(prog, sizeof(infolog), NULL, infolog);
fprintf(stderr, "Error validating shader program: '%s'\n", infolog); }
glDeleteShader(vshade);
glDeleteShader(fshade);
return 1; }
int main() {
if(!glfwInit()) {
puts("GLFW failed to initialize!");
return EXIT_FAILURE; }
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow *window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
if(window == NULL) {
puts("Failed to create window!");
glfwTerminate();
return EXIT_FAILURE; }
glfwMakeContextCurrent(window);
if(glewInit() != GLEW_OK) {
puts("GLEW failed to initialize!");
glfwDestroyWindow(window);
glfwTerminate();
return EXIT_FAILURE; }
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
initProg();
while(!glfwWindowShouldClose(window)) {
render(window); }
glDeleteProgram(prog);
glDeleteBuffers(1, &VBO);
glfwDestroyWindow(window);
glfwTerminate();
return EXIT_SUCCESS; }
最佳答案
原来我创建了一个函数来初始化 VBO 和 VAO...但是忘了调用它。两天。
关于无法让 OpenGL 3.3 绘制三角形,不会抛出任何错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443058/
我有几个系统使用 docker-compose 并且没有问题。 但是,我在这里有一个“向下”根本不做任何事情的地方。 'up'虽然完美。这是在 MacOS 上。 该项目的昵称是“ Storm ”,脚本
解释起来确实很奇怪,所以就这样...... 我正在从 phpmyadmin 获取包含未转义单引号的数据。我正在尝试转换'至'通过使用Content-Type: text/html;在 php
伙计们?在这里需要一些帮助。我使用委托(delegate)协议(protocol)将一些字符串从“第二个 View Controller ”传回给它的前一个。 我的数组附加了我在委托(delegate
我有以下 eval() 东西: c = Customer() eval("c.name = row.value('customer', '{c}')".format(c=column_name), {
我写了这个测试类: @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) public class Candi
我这样写代码: @ContextConfiguration(locations = { "classpath:/test/BeanConfig.xml" }) @RunWith(SpringJUnit
假设我更改了文件,然后进行 pull 。 Git 会报错,因为本地仓库还没有保存,将被覆盖。如果我然后删除该添加并使文件与以前相同(与远程 repo 相同),那么会发生 pull 吗? 最佳答案 是的
前言 很多同学将虚拟列表当做亮点写在简历上面,但是却不知道如何手写,那么这个就不是加分项而是减分项了。在上一篇文章欧阳教会你 如何实现一个定高虚拟列表 ,但是实际项目中更多的是不定高虚拟列表,这篇文
我正在阅读《Java for Dummies》一书,但遇到了问题。我不明白为什么 @Override 不起作用。我确信这与我的代码有关,因为我之前已经获得了一个多态数组来使用覆盖,但它对我来说太简单了
我从我的项目中提取了这段代码,因为我试图找到我犯的一个错误,该错误使我的 BeginStoryboard 无法自行停止。我尽可能地简化了代码,但仍然没有发现问题。你认为它可能是什么?
这个问题在这里已经有了答案: Difference between char[] and char * in C [duplicate] (3 个答案) 关闭 7 年前。 我想我知道自己问题的答案,
我一直在使用 java 的 Scanner 类时遇到问题。我可以让它很好地读取我的输入,但问题是当我想要输出一些东西时。给定多行输入,我想在完全读取所有输入后只打印一行。这是我用来读取输入的代码:
对于这个问题,我已经用最简单的术语表达了这一点。 如果元素被点击,'active'类被添加到元素,'active'类从其他元素中移除。 但是,如果该元素是“事件的”并且它被第二次单击,则“事件”类不应
这会在桌面上创建一个新文件夹,但不会将文件夹 .pfrom 的内容 move 到文件夹 .pTo。 int main() { SHFILEOPSTRUCT sf = {0}; TCHA
我有一个关于多线程调试 DLL (/MDd) 和多线程调试 (/MTd) 设置的问题。它们之间的区别很明显:一个是使用动态库,一个是使用静态库。当我使用/MDd 编译我的程序时,一切都进行得很好。但是
我的问题是,如果我在页面加载时创建一个克隆变量,jQuery 只会 append 它一次。奇怪! Click to copy This is an element! $(document)
所以...我是一个开发 django 应用程序的新手,但是当我尝试通过 virtualbox heroku 运行 heroku run python manage.py syncdb 时,它一直在下面
我在 Spring Boot 初始化时遇到了问题。我在一个简单的 Spring Boot 项目中有这个结构。 com.project.name |----App.java (Annoted with
我在 www.7hermanosmx.com/menu.php 页面上有以下代码 - 一切正常,除了黄色框(类 menuholder)应该每行三个相互 float 。他们坚决拒绝这样做!我知道我做错了
我正在尝试在我正在构建的小型网站上添加一个下拉菜单。出于某种原因,我可以获得我想要向下滑动到 fadeOut() 的 div 并执行其他类似的操作,但我无法将它获取到 slideDown()。我不知道
我是一名优秀的程序员,十分优秀!