标签: opengl

如何将std :: string传递给glShaderSource?

我有以下代码:

glShaderSource(shader, 1, (const char **)data.c_str(), NULL);
Run Code Online (Sandbox Code Playgroud)

但这会让我的程序崩溃.我怎么转换std::stringconst 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但显然它没有任何区别.

c++ opengl string char

28
推荐指数
4
解决办法
3万
查看次数

OpenGL围绕一个点旋转相机

在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 3d camera rotation

27
推荐指数
2
解决办法
7万
查看次数

在OpenGL中获得流畅,重要的一点

我开始玩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)

这是结果: 上述代码的结果

积分显示在预期的位置,只有它们的形状是错误的.

c opengl glut

27
推荐指数
1
解决办法
5万
查看次数

哪些OpenGL功能不是GPU加速的?

当我读到这篇文章(来自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:

本主题不涉及矩阵转换的工作原理.还有其他 主题.

opengl gpu hardware-acceleration opengl-3

27
推荐指数
4
解决办法
1万
查看次数

生成带有三角形条带的平面

生成使用三角形条绘制平面的顶点列表的最佳算法是什么?

我正在寻找一个接收平面宽度和高度的函数,并返回一个包含正确索引顶点的浮点数组.

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 geometry plane gl-triangle-strip

27
推荐指数
3
解决办法
4万
查看次数

使用Visual C++在Opengl中创建3D球体

我无法使用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)

c++ opengl

27
推荐指数
3
解决办法
10万
查看次数

glm ::透视解释

我试图了解以下代码的作用:

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 glm-math

27
推荐指数
2
解决办法
4万
查看次数

sampler2D存储什么?

我已经阅读了一个纹理示例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)

我对某些事感到困惑.我有一些问题:

  1. 在片段着色器中,纹理传递零值(通过glUniform1i).价值真的是零吗?价值还有别的吗?

  2. glUniform1i()调用真正需要的?

  3. 为什么我们在glUniform1i中传递零值?

opengl glsl

27
推荐指数
1
解决办法
3万
查看次数

Cmake链接库目标链接错误

嗨我有链接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)

c++ opengl glut glew cmake

27
推荐指数
1
解决办法
5万
查看次数

gl_triangle_strip vs gl_triangle_fan

我需要一个多边形的例子,只能通过triangle_strip和另一个只能通过triangle_fan完成的多边形来完成.

opengl gl-triangle-strip

27
推荐指数
2
解决办法
3万
查看次数