OpenGL ES渲染循环放在我的iphone应用程序中的一个单独的线程上.除了EAGLContext的presentRenderbuffer方法失败之外,一切都很顺利.结果是一个空白的白色屏幕.当在主线程上运行相同的代码时,presentRenderbuffer会成功并正确显示图形.在单独的线程上执行OpenGL的正确方法是什么?
我忘记了,但EAGL是否代表任何特定的东西?或者它只是Core Animation OpenGL命名约定(CAEAGLLayer等)的一部分?
我是使用C++进行OpenGL编程的新手,并不是很擅长数学.是否有一种简单的方法来进行等角投影?
我指的是真正的等距投影,而不是一般的正交投影.
(等距投影仅在单位X,Y和Z矢量的投影长度相等且它们之间的角度恰好为120度时发生.)
代码片段受到高度赞赏..
基本上,给定一个quaterion(qx,qy,qz,qw)...我怎样才能将它转换为OpenGL旋转矩阵?我也对哪个矩阵行是"向上","向右","向前"等感兴趣...我在矢量中需要四元数的相机旋转...
我已经看过这里发布的一些关于此事的问题,但仍然无法解决为什么我的2d HUD出现但让我的3D渲染世界消失了.
编辑:似乎2d场景正在控制整个屏幕所以我时不时地看到3D场景在2d场景中出现故障.因此即使我只渲染一个10 x 10像素的四边形,它也会渲染出来,然后将剩余的屏幕空白.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0,-0.5,-6.0);
glPushMatrix();
..Draw some 3d stuff...
glPopMatrix();
// Start 2d
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(0.0f, 255.0f, 1.0f);
glBegin(GL_QUADS);
glVertex2f(0.0, 0.0);
glVertex2f(10.0, 0.0);
glVertex2f(10.0, 10.0);
glVertex2f(0.0, 10.0);
glEnd();
Run Code Online (Sandbox Code Playgroud)
然后我交换缓冲区
这是我的代码的顺序.就像它使得3d空间然后使得2d空间反过来取消了3d空间.
我试图加载BMP文件
AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
FILE *File=NULL; // File Handle
if (!Filename) // Make Sure A Filename Was Given
{
return NULL; // If Not Return NULL
}
File=fopen(Filename,"r"); // Check To See If The File Exists
if (File) // Does The File Exist?
{
fclose(File); // Close The Handle
return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
}
return NULL; // If Load Failed Return NULL
}
Run Code Online (Sandbox Code Playgroud)
这来自一个例子,但我现在得到错误
错误C2664:'auxDIBImageLoadW':无法将参数1从'char*'转换为'LPCWSTR'
我怎么能纠正这个?
我的顶点由具有以下结构的数组组成:
[ Position ][ colour ]
[float][float][float][byte][byte][byte][byte]
Run Code Online (Sandbox Code Playgroud)
传递顶点位置没有问题:
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
gl.vertexAttribPointer(this.material.aVertexPosition, 3, gl.FLOAT, false, 4, 0);
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何将颜色传递给着色器.不幸的是,在glsl着色器中使用整数是不可能的,所以我必须使用浮点数.如何将无符号字节颜色值转换为glsl浮点颜色值?我为r,g和b做了这样的尝试,但颜色都搞砸了:
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
gl.vertexAttribPointer(this.material.aR, 1, gl.BYTE, false, 15, 12);
Run Code Online (Sandbox Code Playgroud)
顶点着色器(colouredPoint.vs)
precision highp float;
attribute vec3 aVertexPosition;
attribute float aR;
attribute float aG;
attribute float aB;
uniform mat4 world;
uniform mat4 view;
uniform mat4 proj;
varying vec3 vVertexColour;
void main(void){
gl_PointSize = 4.0;
gl_Position = proj * view * world * vec4(aVertexPosition, 1.0);
vVertexColour = vec3(aR, aG, aB);
}
Run Code Online (Sandbox Code Playgroud)
像素着色器(colouredPoint.fs)
precision highp float;
varying vec3 …Run Code Online (Sandbox Code Playgroud) 这是我当前的Makefile的一部分:
CFLAGS = -O2 -Wall -pedantic -std=gnu++11 `sdl-config --cflags --libs` -lSDL_mixer
Run Code Online (Sandbox Code Playgroud)
我正确安装了libsdl,SDL.h位于/ usr/include/sdl所属的地方,但它不会编译.#include "SDL.h"我的.h文件中也有这行,但仍然没有.
谁知道为什么?
我正在尝试设置着色器制服的功能,但是当我尝试编译它时,我收到此错误:
错误2错误C2719:'value':带__declspec的形式参数(align('16'))将不对齐
这是功能代码:
void Shader::setUniform(std::string name, const glm::mat4 value){
GLint uniform = glGetUniformLocation(m_program, name.c_str());
glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual Studio 2013.
我想使用Qt和PyOpenGL做一些实时绘图并学习一些关于OpenGL的内容,但是甚至无法让我的initail测试数据显示出来.
这个想法是将x坐标和y坐标存储在不同的缓冲区中,因为x坐标很少会改变,而y坐标几乎每次渲染都会改变.不幸的是,让它们在不同的缓冲区中给我带来了麻烦.
现在我没有错误,没有任何东西出现,所以我不知道该去哪里.
这是我到目前为止绘图类的内容:
class GLWidget(QtOpenGL.QGLWidget):
def __init__(self, parent=None):
self.parent = parent
QtOpenGL.QGLWidget.__init__(self, parent)
self.current_position = 0
def initializeGL(self):
self.initGeometry()
self.vertex_code = """
#version 120
attribute vec4 color;
attribute float x_position;
attribute float y_position;
varying vec4 v_color;
void main()
{
gl_Position = vec4(x_position, y_position, 0.0, 1.0);
v_color = color;
} """
self.fragment_code = """
#version 120
varying vec4 v_color;
void main()
{
//gl_FragColor = v_color;
gl_FragColor = vec4(1,1,1,1);
} """
## Build and activate program
# Request program and shader …Run Code Online (Sandbox Code Playgroud)