我有以下代码:
glShaderSource(shader, 1, (const char **)data.c_str(), NULL);
Run Code Online (Sandbox Code Playgroud)
但这会让我的程序崩溃.我怎么转换std::string成const char **?我也试过, (const char **)&但它说"需要l值",我不明白.我使用这段代码时工作正常:
const char *data = "some code";
glShaderSource(shader, 1, &data, NULL);
Run Code Online (Sandbox Code Playgroud)
但我不能直接从一个工作std::string.我可以char为它分配一个新数组,但这不是很好的代码.
我也尝试过,const GLchar但显然它没有任何区别.
在OpenGL中,我试图围绕一个点旋转相机,相机距离点距离r并且在旋转时面向点.换句话说,我希望相机沿着圆心圆周从中心移动半径为r,相机在圆周的任何一点都面向中心.
让我们说在3d空间中圆的中心是(3,0,3);
我试过了:
// move to center of circle
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);
Run Code Online (Sandbox Code Playgroud)
其中CameraAngle是围绕圆圈移动的度数.
我的最终结果是相机仍然沿着原点旋转,而不是圆圈的中心.任何人都可以帮我解决这个问题吗?谢谢!
我开始玩OpenGL和GLUT.我想提出一些观点,但问题是它们变成了正方形,我希望它们是圆点(圆圈).
这就是我做的:
void onInitialization( )
{
glEnable( GL_POINT_SMOOTH );
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glPointSize( 6.0 );
}
void onDisplay()
{
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glBegin( GL_POINTS );
glColor3f( 0.95f, 0.207, 0.031f );
for ( int i = 0; i < g_numPoints; ++i )
{
glVertex2f( g_points[i].X, g_points[i].Y );
}
glEnd();
glFinish();
glutSwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)
这是结果:

积分显示在预期的位置,只有它们的形状是错误的.
当我读到这篇文章(来自OpenGL wiki)时,我很震惊:
glTranslate,glRotate,glScale
这些硬件加速了吗?
不,没有已知的GPU可以执行此操作.驱动程序计算CPU上的矩阵并将其上载到GPU.
所有其他矩阵操作也在CPU上完成:glPushMatrix,glPopMatrix,glLoadIdentity,glFrustum,glOrtho.
这就是GL 3.0中不推荐使用这些函数的原因.您应该拥有自己的数学库,构建自己的矩阵,将矩阵上传到着色器.
在很长一段时间里,我认为大多数OpenGL函数都使用GPU来进行计算.我不确定这是否是一种常见的误解,但经过一段时间的思考,这是有道理的.由于状态切换太多,旧的OpenGL函数(2.x及更早版本)实际上不适合实际应用程序.
这让我意识到,许多OpenGL函数可能根本不使用GPU.
所以,问题是:
哪个OpenGL函数调用不使用GPU?
我相信知道上述问题的答案将有助于我成为一名更好的OpenGL程序员.请分享一些您的见解.
编辑:
我知道这个问题很容易导致优化水平.这很好,但这不是这个问题的意图.
如果有人知道某个流行实现的一组GL函数(如AshleysBrain建议,nVidia/ATI,可能依赖于操作系统)不使用GPU,那就是我所追求的!
合理的优化指南稍后会出现.让我们关注本主题的功能.
EDIT2:
生成使用三角形条绘制平面的顶点列表的最佳算法是什么?
我正在寻找一个接收平面宽度和高度的函数,并返回一个包含正确索引顶点的浮点数组.
width表示每行的顶点数.
height表示每列的顶点数.
float* getVertices( int width, int height ) {
...
}
void render() {
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, getVertices(width,heigth));
glDrawArrays(GL_TRIANGLE_STRIP, 0, width*height);
glDisableClientState(GL_VERTEX_ARRAY);
}
Run Code Online (Sandbox Code Playgroud) 我无法使用C++中的OpenGL库函数glutSolidSphere()创建一个简单的3D球体.
这是我试过的:
#include<GL/glu.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glLoadIdentity();
glutSolidSphere( 5.0, 20.0, 20.0);
glFlush();
}
void myInit()
{
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(1.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,499.0,0.0,499.0);
glMatrixMode(GL_MODELVIEW);
}
void main(int argc,char **argv)
{
qobj = gluNewQuadric();
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutCreateWindow("pendulum");
glutDisplayFunc(display);
myInit();
glutMainLoop();
}
Run Code Online (Sandbox Code Playgroud) 我试图了解以下代码的作用:
glm::mat4 Projection = glm::perspective(35.0f, 1.0f, 0.1f, 100.0f);
Run Code Online (Sandbox Code Playgroud)
它是否创建了投影矩阵?剪掉不在用户视图中的任何内容?我无法在API页面上找到任何内容,我在他们网站上的pdf中唯一能找到的是:
gluPerspective:
glm::mat4 perspective(float fovy, float aspect, float zNear,
float zFar);
glm::dmat4 perspective(
double fovy, double aspect, double zNear,
double zFar);
From GLM_GTC_matrix_transform extension: <glm/gtc/matrix_transform.hpp>
Run Code Online (Sandbox Code Playgroud)
但它没有解释参数.也许我错过了什么.
我已经阅读了一个纹理示例OpenGL 2.1.片段着色器看起来像这样:
#version 120
uniform sampler2D texture;
varying vec2 texcoord;
void main(void)
{
gl_FragColor = texture2D(texture, texcoord);
}
Run Code Online (Sandbox Code Playgroud)
在texcoord从顶点着色器传递.
使用以下C++呈现代码:
void render()
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glUniform1i(unf_texture, 0);
}
Run Code Online (Sandbox Code Playgroud)
我对某些事感到困惑.我有一些问题:
在片段着色器中,纹理传递零值(通过glUniform1i).价值真的是零吗?价值还有别的吗?
被glUniform1i()调用真正需要的?
为什么我们在glUniform1i中传递零值?
嗨我有链接Glfw和其他库使用cmake的问题.从命令行我编译如下
g++ main.cpp -lGL -lGLU -lGLEW -lglfw
Run Code Online (Sandbox Code Playgroud)
但我想用cmake进行编译.我试图使用target_linkg_libraries,但这会产生错误
CMakeLists.txt上的CMake错误:18(target_link_libraries):无法为目标"GL"指定不是由此
项目构建的链接库.
我尝试使用添加定义来做到这一点.我没有看到错误,但这不链接库.
cmake_minimum_required (VERSION 2.6)
project (test)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
ADD_DEFINITIONS(
-lGL
-lGLU
-lGLEW
-lglfw
)
add_executable(test.out
main.cpp
)
target_link_libraries(GL GLU GLEW glfw)
Run Code Online (Sandbox Code Playgroud) 我需要一个多边形的例子,只能通过triangle_strip和另一个只能通过triangle_fan完成的多边形来完成.