Live renderings is now working.

main
Brett 2022-10-28 12:46:32 -04:00
parent 2597a160f8
commit 7b379f722d
10 changed files with 96 additions and 38 deletions

View File

@ -48,3 +48,27 @@
2 979 1666934238694879112 CMakeFiles/Step_3.dir/src/graphics/graphics.cpp.o ce988de97a5cb51d
1 1916 1666934239630907257 CMakeFiles/Step_3.dir/src/engine/main.cpp.o 641dce3f86933e2e
1916 1979 1666934239694909183 Step_3 8e1012bfab9235e9
2 1132 1666973684372901616 CMakeFiles/Step_3.dir/src/graphics/graphics.cpp.o ce988de97a5cb51d
1 1928 1666973685168926327 CMakeFiles/Step_3.dir/src/engine/main.cpp.o 641dce3f86933e2e
1 4712 1666973687953012743 CMakeFiles/Step_3.dir/src/graphics/gl/gl.cpp.o 330ad35a6abf06c3
4712 4813 1666973688053015848 Step_3 8e1012bfab9235e9
1 972 1666973802264549771 CMakeFiles/Step_3.dir/src/graphics/graphics.cpp.o ce988de97a5cb51d
972 1039 1666973802332551868 Step_3 8e1012bfab9235e9
1 957 1666973853034114376 CMakeFiles/Step_3.dir/src/graphics/graphics.cpp.o ce988de97a5cb51d
957 1024 1666973853098116348 Step_3 8e1012bfab9235e9
1 957 1666974027615470803 CMakeFiles/Step_3.dir/src/graphics/graphics.cpp.o ce988de97a5cb51d
957 1026 1666974027683472884 Step_3 8e1012bfab9235e9
1 958 1666974062028522979 CMakeFiles/Step_3.dir/src/graphics/graphics.cpp.o ce988de97a5cb51d
958 1026 1666974062096525059 Step_3 8e1012bfab9235e9
1 971 1666974109329967557 CMakeFiles/Step_3.dir/src/graphics/graphics.cpp.o ce988de97a5cb51d
971 1037 1666974109393969509 Step_3 8e1012bfab9235e9
1 4589 1666974300435787409 CMakeFiles/Step_3.dir/src/graphics/gl/gl.cpp.o 330ad35a6abf06c3
4589 4657 1666974300503789473 Step_3 8e1012bfab9235e9
1 4563 1666974526658651253 CMakeFiles/Step_3.dir/src/graphics/gl/gl.cpp.o 330ad35a6abf06c3
4563 4626 1666974526722653192 Step_3 8e1012bfab9235e9
1 4557 1666974781086349492 CMakeFiles/Step_3.dir/src/graphics/gl/gl.cpp.o 330ad35a6abf06c3
4557 4626 1666974781154351547 Step_3 8e1012bfab9235e9
1 5008 1666974850596449938 CMakeFiles/Step_3.dir/src/graphics/gl/gl.cpp.o 330ad35a6abf06c3
5008 5075 1666974850664451993 Step_3 8e1012bfab9235e9
1 4945 1666974914782388699 CMakeFiles/Step_3.dir/src/graphics/gl/gl.cpp.o 330ad35a6abf06c3
4945 5009 1666974914846390631 Step_3 8e1012bfab9235e9

Binary file not shown.

View File

@ -1,3 +1,3 @@
Start testing: Oct 28 01:17 EDT
Start testing: Oct 28 12:41 EDT
----------------------------------------------------------
End testing: Oct 28 01:17 EDT
End testing: Oct 28 12:41 EDT

View File

@ -4,7 +4,7 @@ Size=95,60
Collapsed=0
[Window][Dear ImGui Demo]
Pos=501,181
Pos=874,4
Size=550,680
Collapsed=1

View File

@ -257,7 +257,7 @@ Texture::Texture(Raytracing::Image* image): _image(image), width(image->getWidth
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, width, height);
//glGenerateMipmap(GL_TEXTURE_2D);
// no sense sending data now since this texture is likely all black.
@ -298,8 +298,9 @@ void Texture::updateImage() {
// unfortunately we do have to put the data into a format that OpenGL can read. This is a TODO:?
data = new unsigned char[(unsigned long)(width) * (unsigned long)height * 3];
int pixelIndex = 0;
for (int j = width-1; j >= 0; j--) {
for (int i = 0; i < height; i++) {
// slightly different order from STBi
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
data[pixelIndex++] = _image->getPixelR(i, j);
data[pixelIndex++] = _image->getPixelG(i, j);
data[pixelIndex++] = _image->getPixelB(i, j);

View File

@ -8,7 +8,7 @@
#include <graphics/gl/gl.h>
namespace Raytracing {
// const std::vector<float> vertices = {
// 1.0f, 1.0f, 0.0f, // top right
// 1.0f, 0.0f, 0.0f, // bottom right
@ -28,10 +28,10 @@ namespace Raytracing {
// 0.0f, 1.0f // top left
// };
const std::vector<float> vertices = {
1.0f, 1.0f, 0.0f, // top right
1.0f, -1.0f, 0.0f, // bottom right
-1.0f, -1.0f, 0.0f, // bottom left
-1.0f, 1.0f, 0.0f // top left
1.0f, 1.0f, 0.0f, // top right
1.0f, -1.0f, 0.0f, // bottom right
-1.0f, -1.0f, 0.0f, // bottom left
-1.0f, 1.0f, 0.0f // top left
};
const std::vector<unsigned int> indices = {
@ -58,47 +58,50 @@ namespace Raytracing {
}
void deleteQuad() {
delete(quad);
delete (quad);
}
// unfortunately GLX doesn't provide a typedef for the context creation, so we must define our own. I've chosen to go with the same style as
// GL function pointers, "Pointer to the FunctioN GLX createContextAttribsARB PROCedure"
typedef GLXContext (* PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
XWindow::XWindow(int width, int height): m_width(width), m_height(height) {
// open the DEFAULT display. We don't want to open a specific screen as that is annoying.
dlog << "Creating X11 display!";
dlog << "Creating X11 display!\n";
display = XOpenDisplay(NULL);
if (display == NULL)
throw std::runtime_error("Unable to open an X11 display! Is the X server running?");
// FBConfigs were added in GLX version 1.3.
if (!glXQueryVersion( display, &glx_major, &glx_minor ))
if (!glXQueryVersion(display, &glx_major, &glx_minor))
throw std::runtime_error("Unable to get GLX version!");
if ((glx_major < 1) || (glx_major == 1 && glx_minor < 3))
if ((glx_major < 1) || (glx_major == 1 && glx_minor < 3))
throw std::runtime_error("Invalid GLX Version. At least 1.3 is required!");
// get the frame buffer config from the X11 window
frameBufferConfig = glXChooseFBConfig(display, DefaultScreen(display), visual_attribs, &frameBufferCount);
if (!frameBufferConfig)
throw std::runtime_error("Unable to get window framebuffer configs!");
dlog << "We have " << frameBufferCount << " framebuffers\nSelecting the best!";
dlog << "We have " << frameBufferCount << " framebuffers\n";
// select the best config from available ones.
int bestConfigIndex = -1, worstConfig = -1, bestSamples = -1, worstSamples = 999;
for (int i = 0; i < frameBufferCount; i++){
XVisualInfo *xVisualInfo = glXGetVisualFromFBConfig(display, frameBufferConfig[i]);
if (xVisualInfo){
int bestConfigIndex = 0, bestSamples = -1;
for (int i = 0; i < frameBufferCount; i++) {
XVisualInfo* xVisualInfo = glXGetVisualFromFBConfig(display, frameBufferConfig[i]);
if (xVisualInfo) {
int sampleBuffer, samples;
glXGetFBConfigAttrib(display, frameBufferConfig[i], GLX_SAMPLE_BUFFERS, &sampleBuffer);
glXGetFBConfigAttrib(display, frameBufferConfig[i], GLX_SAMPLES, &samples);
dlog << "Checking framebuffer config " << i << " with samples: " << samples;
if ( bestConfigIndex < 0 || sampleBuffer && samples > bestSamples )
bestConfigIndex = i, bestSamples = samples;
if ( worstConfig < 0 || !sampleBuffer || samples < worstSamples )
worstConfig = i, worstSamples = samples;
// if the sample buffer exists, and we have more samples in this config, make this config the one we use.
if (sampleBuffer && samples > bestSamples) {
bestConfigIndex = i;
bestSamples = samples;
}
}
XFree(xVisualInfo);
}
dlog << "We selected config: " << bestConfigIndex << " with " << bestSamples << "# of samples!\n";
GLXFBConfig bestConfig = frameBufferConfig[bestConfigIndex];
// we need to make sure we remember to free memory since we are working with c pointers!
XFree(frameBufferConfig);
// as I understand it every window in X11 is a sub-window of the root, or desktop window
// which is why I guess wayland was created, because X11 can't handle a bunch of stuff like VRF (variable refresh rate)
// because your say two monitors are treated as one big window, in effect limiting the refresh rate
@ -106,7 +109,7 @@ namespace Raytracing {
// plus needless security in a low level lib preventing stuff like discord screen sharing. Annoying as hell. /rant/.
desktop = DefaultRootWindow(display);
// try to open a gl visual context that meets our attributes' requirements
dlog << "Getting visual info!";
dlog << "Getting visual info!\n";
visualInfo = glXChooseVisual(display, 0, OpenGLAttributes);
// if our attributes are too much for the display, let's try reducing them. (modern hardware should support 24bit depth though)
if (visualInfo == NULL) {
@ -114,7 +117,7 @@ namespace Raytracing {
OpenGLAttributes[2] = 16;
visualInfo = glXChooseVisual(display, 0, OpenGLAttributes);
if (visualInfo == NULL) {
throw std::runtime_error("Unable to create window's visual context. Is your driver up to date?");
throw std::runtime_error("Unable to create window's visual context. Is your driver up to date?\n");
}
}
ilog << visualInfo->visualid << ": With depth: " << visualInfo->depth << " and RGB: " << visualInfo->bits_per_rgb << "\n";
@ -141,6 +144,13 @@ namespace Raytracing {
visualInfo->visual,
CWColormap | CWEventMask,
&xSetWindowAttributes);
// install a error handler
// maybe we should set back the old one but i'd rather it goto std:err than crash the window
XSetErrorHandler([](Display* displayPtr, XErrorEvent* eventPtr) -> int {
elog << "An error occurred while trying to setup X11: " << eventPtr->error_code << ";\n " << eventPtr->minor_code << ";\n "
<< eventPtr->request_code << "\n";
return 0;
});
// Now show the window
XMapWindow(display, window);
@ -148,9 +158,32 @@ namespace Raytracing {
// there might actually be an argument to be made about X11 being outdated....
wmDelete = XInternAtom(display, "WM_DELETE_WINDOW", True);
XSetWMProtocols(display, window, &wmDelete, 1);
// get the list of GLX extensions for this system
const char* glExtensions = glXQueryExtensionsString(display, DefaultScreen(display));
// much in the same way that we get GL function pointers and use them we will do the same with the context creation
auto glXCreateContextAttribsARBPtr = (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddressARB((unsigned char*) "glXCreateContextAttribsARB");
// now we can finally create a OpenGL context for our window
glContext = glXCreateContext(display, visualInfo, NULL, GL_TRUE);
int OpenGLContextAttributes[] = {
// OpenGL major version, we want GL4.5+
GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
// OpenGL minor version,
GLX_CONTEXT_MINOR_VERSION_ARB, 5,
// I don't remember what this does, but I know GLFW recommends that forward compatability be set true,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
// Core profile for better Renderdoc compatibility + I don't need non core extensions
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
None
};
// now we can actually create and acquire the context
glContext = glXCreateContextAttribsARBPtr(display, bestConfig, 0, True, OpenGLContextAttributes);
// make sure if there was any error we are notified
XSync(display, False);
if (!glContext)
flog << "Unable to create GL context!";
if (glXIsDirect(display, glContext)){
ilog << "A direct GL context was acquired!\n";
} else // direct contexts are faster than indirect!
wlog << "Warning! Indirect context!\n";
// make the currently executing thread the one current to the OpenGL context
// since OpenGL is a single threaded finite state machine if we want to do mutli-threading with OpenGL (we don't)
// this has to be called in each thread before we make use of any OpenGL function.
@ -158,7 +191,7 @@ namespace Raytracing {
// Now we can issue some OpenGL commands
// we want to respect depth
glEnable(GL_DEPTH_TEST);
assignGLFunctionPointers();
//glEnableVertexArrayAttribPtr = glXGetProcAddress((unsigned char*)("glEnableVertexArrayAttrib"));
@ -178,7 +211,7 @@ namespace Raytracing {
// only try to check events if they are queued
while (XPending(display) > 0) {
XNextEvent(display, &events);
// one of the few times I'll use a switch statement
switch (events.type) {
// called when the system thinks that the window should be updated
@ -255,18 +288,18 @@ namespace Raytracing {
m_width,
m_height);
ImGui::NewFrame();
static bool t = true;
if (t)
ImGui::ShowDemoWindow(&t);
// do our drawing
drawFunction();
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
ImGui_ImplGlfw_UpdateMouseData(true, true);
// we use double buffering to prevent screen tearing and other visual disturbances
glXSwapBuffers(display, window);
}