我正在使用使用OpenGL的第三方DLL.目前第三方无法正常工作,因为显示器无法正确刷新.我开始怀疑OpenGL库未正确安装或可能已过时.
有没有办法在Windows上更新OpenGL库?是否有一个官方网站将保存正确的opengl.dll文件或类似的东西?
glCallLists()是一个方便的功能,用于渲染一系列显示列表,尤其是文本渲染等.我很好奇 - 它实际上是更有效率的呼叫glCallLists(),还是仅仅是一种便利功能?例如,这两个片段中的哪一个可能更快?
const char *str = "this is a test";
// suppose the display lists numbered [displayListBase..displayListBase+255] have
// been initialized with display lists to render each ASCII character
// snippet 1:
glListBase(displayListBase);
glCallLists(strlen(str), GL_UNSIGNED_BYTE, str);
// snippet 2:
const char *s;
for(s = str; *s; s++)
glCallList(displayListBase + (unsigned char)*s);
Run Code Online (Sandbox Code Playgroud)
我不是想过早地优化,我只是好奇是否glCallLists提供了比手动方法更重要的优势.如果没有,那为什么它存在?OpenGL往往非常简约,因为很少有便利功能,这些功能并不是绝对必要的.确实存在的便利函数通常在glu命名空间(GL实用程序)下,例如gluOrtho2D(),它提供了一个包装器glOrtho().
我还没有尝试过分析这两个片段,虽然我猜测分析可能会因CPU-GPU交互而变得复杂,特别是在如此短的时间内.运行时也可能受到所涉及的显示列表的大小以及执行的显示列表的数量的显着影响.
我在使用MSVS 2013设置OpenGL时遇到了麻烦.我知道我的Windows平台上的opengl32.dllC:\Windows\System32是OpenGL 1.1的一个实现.
我想要做的是加载更新的OpenGL> 1.1函数,如glBindBuffer和glBufferData.我已经读过可以使用指向函数的指针wglGetProcAddress.当使用此函数时,返回的指针始终为null,GetProcAddress(OpenGL32DLL, "...")除了较新的函数之外,dll中的所有原始函数都可以正常工作.
我希望这里的任何人都可以帮助我完成我的设置并指出我做错了什么或者我是否错过了什么.
所以我们走了:
我已经下载的OpenGL扩展浏览器4.4,其指出我能够完美地高达2.1 OpenGL的运行应该是绰绰有余使用或负载更多glBindBuffer和glBufferData.
我下载了Microsoft SDKs/v7.1,其中包含标题:gl/glu.h和gl/gl.h; 我还从这里下载了GLEXT扩展API,并将glext.lib+包含在标题中.
链接器中的文件:
C:\ Program Files\Microsoft SDKs\Windows\v7.1\Lib\OpenGL32.Lib
C:\ Program Files\Microsoft SDKs\Windows\v7.1\Lib\GlU32.Lib
C:\用户\用户\桌面\ glext\LIB\glext.lib
C:\ Program Files\Microsoft SDKs\Windows\v7.1\Include - > GL.h,GLU.h
C:\ Users\user\Desktop\glext\include - > glcorearb.h,glext.h,wglext.h
我正在尝试将opengl中的屏幕区域保存到位图中.我尝试过使用FreeImage和SDL_Image,它们都要求我交换红色和蓝色通道.当然,这让我怀疑glReadPixels是这里的问题......我有这个示例代码:
bool CaptureScreenRegionToFile ( uint32_t In_X, uint32_t In_Y, uint32_t In_Width, uint32_t In_Height, std::string In_Filename )
{
GLubyte* ImageData = ( GLubyte* ) malloc ( In_Width * In_Height * 3 );
glPixelStorei ( GL_PACK_ALIGNMENT, 1 );
glReadPixels ( In_X, In_Y, In_Width, In_Height, GL_RGB, GL_UNSIGNED_BYTE, ImageData );
if ( CheckError() == false )
{
free ( ImageData );
return false;
}
SDL_Surface *Surface;
// JTP TODO Known bug here. Red and blue are swapped, for some reason...
Surface = SDL_CreateRGBSurfaceFrom ( ImageData, …Run Code Online (Sandbox Code Playgroud) 我试图在GLFW的帮助下在OpenGL中创建一个空白窗口.下面是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <glfw3.h>
GLFWwindow* window;
#include <glm/glm.hpp>
using namespace glm;
int main( void )
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(800,600,"learnopengl",NULL,NULL);
if (window == NULL)
{
fprintf(stderr,"there is a problem with window creation\n");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
fprintf(stderr,"Failed to initialize GLEW\n");
return -1;
}
int width, height;
glfwGetFramebufferSize(window,&width,&height);
glViewport(0,0,width,height);
while(!glfwWindowShouldClose(window))
{
glfwPollEvents();
glfwSwapBuffers(window);
}
glfwTerminate();
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行上面的代码而不是黑色空白时,它会在新创建的窗口中显示当前屏幕的实例.
我有3072个类型的值std::int16_t(16位整数),它对应于a GLshort.我想把它们发送到我的GLSL着色器.我读了Buffer Textures并试图实现这种方法.但是,一旦到达着色器,数据似乎不再完好无损.我还不确定,但看起来这些价值都是0最大值的.我究竟做错了什么?
我的初始化代码看起来像这样(禁止一些不相关的东西):
// 1: Get the data - array of GLshort:
GLshort tboData[3072];
for (size_t i = 0; i < 3072; ++i)
{
// cdb.getSprite() returns std::int16_t
tboData[i] = (GLshort) cbd.getSprite(i);
}
// 2: Make sure the Shader Program is being used:
sp->use(); // sp is a wrapper class for GL Shader Programs
// 3: Generate the GL_TEXTURE_BUFFER, bind it and send the data:
GLuint tbo;
glGenBuffers(1, &tbo);
glBindBuffer(GL_TEXTURE_BUFFER, tbo);
glBufferData(GL_TEXTURE_BUFFER, …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习OpenGL,并且我已经经历了许多关于加载纹理的教程,但是每一个教程似乎都错过了最重要的一步:我如何实际在某些东西上放置纹理?
我正在使用Python,这是我加载纹理的函数:
def loadTexture():
textureSurface = pygame.image.load('test_image.png')
textureData = pygame.image.tostring(textureSurface,"RGBA",1)
width = textureSurface.get_width()
height = textureSurface.get_height()
glEnable(GL_TEXTURE_2D)
texid = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texid)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
return texid
Run Code Online (Sandbox Code Playgroud)
这是加载我的多维数据集的函数:
vertices = (
# x y z
( 1,-1,-1),
( 1, 1,-1),
(-1, 1,-1),
(-1,-1,-1),
( 1,-1, 1),
( 1, 1, 1),
(-1,-1, 1),
(-1, 1, 1)
)
edges = (
(0,1),
(0,3),
(0,4), …Run Code Online (Sandbox Code Playgroud) 我正在学习OpenGL,我试图绘制一个红色三角形,但我的三角形保持黑色.
这是我的片段着色器的代码:
#version 330 core
out vec4 color;
void main()
{
color = vec4(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)
我的着色器编译没有问题,我使用这个类来使用着色器:
public class ShaderProgram
{
private final int programId;
private int vertexShaderId;
private int fragmentShaderId;
public ShaderProgram() throws Exception
{
programId = glCreateProgram();
if (programId == 0) {
throw new Exception("Could not create Shader");
}
}
public void createVertexShader(String shaderCode) throws Exception {
vertexShaderId = createShader(shaderCode, GL_VERTEX_SHADER);
}
public void createFragmentShader(String shaderCode) throws Exception {
fragmentShaderId = createShader(shaderCode, GL_FRAGMENT_SHADER);
}
protected int createShader(String shaderCode, int …Run Code Online (Sandbox Code Playgroud) 假设一家公司在他们的应用程序中实现了一个新颖的着色器,并且他们想要使其难以窃取.但是,OpenGL着色器以纯文本形式发送到GPU,而Vulkan接受一个易于反编译的字节码.是否有任何图形API具有非零级别的着色器模糊处理?
我正在使用着色器编写程序,并在运行构建的exe时遇到一些错误.
着色器程序无法链接
片段着色器使用不同的颜色,但以前的着色器不会写入它.
出于资源错误.
这是我的代码:
example.cpp:
// Two-Dimensional Sierpinski Gasket
// Generated using randomly selected vertices and bisection
#include "Angel.h"
const int NumTimesToSubdivide = 5;
const int NumTetraeder = 1024;
const int NumVertices = 9 * NumTetraeder;
vec4 points[NumVertices];
int Index = 0;
int fps = 20;
float angle_param = 0.5;
float etime;
GLint time_loc;
//----------------------------------------------------------------------------
void triangle(const vec4& a, const vec4& b, const vec4& c)
{
points[Index++] = a;
points[Index++] = b;
points[Index++] = c;
}
void divide_tetraeder(const vec4& …Run Code Online (Sandbox Code Playgroud)